Different results using View with union all in 11R1 compared to 10R2
Hello,
I have the following situation:
In Oracle 10R2 I defined a view which looks like this
create view test_view
as
select 'field1;field2;field3' field from dual
union all
select field
from (
select tfield1||';'||tfield2||';'||tfield3 field
from table1
order by tfield1,tfield2,tfield3
The idea is, my first line contains a header information an then the data in the required sorting order.
So, in 10R2, when I export the view with select field from test_view, I get the result as expected, which means, the header from the part with the dual was in the first line and after that, the data in the required sort order.
Now, in 11.1.0.7, it is completely different, because the row of the dual is somewhere in my result set. But if I send the sql instead of the view, I get the expected result as in 10R2.
I have no idea why this is the case now, because in 10R2 this was working permanently as expected. When I look at the execution plan, I see, that he starts parallelisation, which is ok, but the difference is, that in this parallelisation the select from dual is included and in 10R2 he first make the line from the dual and then the parallelisation with the data. It's not clear to me, that if I send the sql to the database I see the required result, but if i define the view as mentioned, and start a select field from view, I get now get the different sorting, because of the parallelisation, where the optimizer he changes his behavior comparing the both database versions. So my question ist, how can I change this behavior to get the same behavior as in release 10R2.
Best regards
Rainer
Hello,
thank you for your sample, I see your idea for my sorting purpose.
I want to look at the following point:
I create the table, as you described. The table has the degree and instances 1. Now I deefine the following view:
create view view_test
as
select 'field1;field2;field3' field
from dual
union all
select tfield1 || ';' || tfield2 || ';' || tfield3 field
from (select * from table1 order by tfield1,tfield2).
This is the way I used it in 10 R2.
Now, the SQL select field from view_test delivers the expected result:
field1;field2;field3
a;b;c
d;e;f
So far so good. But now, I changed the degree of the table1 (alter table table1 parallel (degree 4 instances 1);).
The result looks like that:
a;b;c
field1;field2;field3
d;e;f
So, the parallelisation of my object seems to be the reason for the, in my eyes, "wrong" sort order. In 10R2 I used this degree and instance values for my table and defined a view and it was working fine. Now, after our migration, I had this "trouble". For me it seems, that the optimizer made some changes, or mabe this is a bug, who knows ?
I also tried, to change the nls_comp, and set the undocumented parameters as described in the Metalink note 7497640.8, but with no effect of my result set.
Best regards
Rainer
Similar Messages
-
Inconsistent SQL results when using View with UNION-ALL and table function
Can any of you please execute the below scripts and check the output. In the table type variable, I am adding 4 distinct object ids, where as in the result, I get only the row pertaining to last id in the table type variable. Same row is returned 4 times (4= number of values in the table type).
This scenario is occurring in our product with a SQL with exactly same pattern. I could simulate the same issue with the sample script I have provided.
Database version: 11.2.0.3 Enterprise Edition, Single node
Thank you.
CREATE TABLE TEMP_T1 AS SELECT * FROM ALL_OBJECTS;
CREATE TABLE TEMP_T2 AS SELECT * FROM ALL_OBJECTS;
UPDATE TEMP_T2 SET OBJECT_ID = OBJECT_ID * 37;
CREATE UNIQUE INDEX TEMP_T1_U1 ON TEMP_T1(OBJECT_ID);
CREATE UNIQUE INDEX TEMP_T2_U1 ON TEMP_T2(OBJECT_ID);
CREATE OR REPLACE VIEW TEMP_T1T2_V AS
SELECT * FROM TEMP_T1 UNION ALL SELECT * FROM TEMP_T2;
CREATE OR REPLACE TYPE TEMP_OBJ_TYPE AS OBJECT (OBJ_ID NUMBER);
CREATE OR REPLACE TYPE TEMP_OBJ_TAB_TYPE IS TABLE OF TEMP_OBJ_TYPE;
SET SERVEROUTPUT ON;
DECLARE
TYPE TEMP_T1T2_V_ROW_TAB_TYPE IS TABLE OF TEMP_T1T2_V%ROWTYPE;
TEMP_T1T2_V_ROW_TAB TEMP_T1T2_V_ROW_TAB_TYPE;
TEMP_OBJ_TAB TEMP_OBJ_TAB_TYPE := TEMP_OBJ_TAB_TYPE();
PROCEDURE ADD_TO_TEMP_OBJ_TAB(OBJ_ID IN NUMBER) IS
BEGIN
TEMP_OBJ_TAB.EXTEND;
TEMP_OBJ_TAB(TEMP_OBJ_TAB.LAST) := TEMP_OBJ_TYPE(OBJ_ID);
END;
BEGIN
ADD_TO_TEMP_OBJ_TAB(100);
ADD_TO_TEMP_OBJ_TAB(116);
ADD_TO_TEMP_OBJ_TAB(279);
ADD_TO_TEMP_OBJ_TAB(364);
DBMS_OUTPUT.PUT_LINE('=====================');
FOR I IN TEMP_OBJ_TAB.FIRST..TEMP_OBJ_TAB.LAST
LOOP
DBMS_OUTPUT.PUT_LINE('OBJ_ID = '||TEMP_OBJ_TAB(I).OBJ_ID);
END LOOP;
DBMS_OUTPUT.PUT_LINE('---------------------');
SELECT * BULK COLLECT INTO TEMP_T1T2_V_ROW_TAB
FROM TEMP_T1T2_V VW
WHERE ((VW.OBJECT_ID) IN (SELECT OBJ_ID
FROM TABLE(CAST(TEMP_OBJ_TAB AS TEMP_OBJ_TAB_TYPE))));
FOR I IN TEMP_OBJ_TAB.FIRST..TEMP_OBJ_TAB.LAST
LOOP
DBMS_OUTPUT.PUT_LINE('OBJ_ID = '||TEMP_OBJ_TAB(I).OBJ_ID);
END LOOP;
DBMS_OUTPUT.PUT_LINE('---------------------');
IF TEMP_T1T2_V_ROW_TAB.COUNT > 0 THEN
FOR I IN TEMP_T1T2_V_ROW_TAB.FIRST..TEMP_T1T2_V_ROW_TAB.LAST
LOOP
DBMS_OUTPUT.PUT_LINE(TEMP_T1T2_V_ROW_TAB(I).OBJECT_ID||' : '||TEMP_T1T2_V_ROW_TAB(I).OBJECT_NAME);
END LOOP;
ELSE
DBMS_OUTPUT.PUT_LINE('NO ROWS RETURNED!');
END IF;
DBMS_OUTPUT.PUT_LINE('---------------------');
END;
/I can reproduce it:
SQL*Plus: Release 11.2.0.3.0 Production on Tue Oct 30 14:05:39 2012
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Enter user-name: scott
Enter password:
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> select *
2 from v$version
3 /
BANNER
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE 11.2.0.3.0 Production
TNS for 64-bit Windows: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production
SQL> CREATE TABLE TEMP_T1 AS SELECT * FROM ALL_OBJECTS;
Table created.
SQL>
SQL> CREATE TABLE TEMP_T2 AS SELECT * FROM ALL_OBJECTS;
Table created.
SQL>
SQL> UPDATE TEMP_T2 SET OBJECT_ID = OBJECT_ID * 37;
72883 rows updated.
SQL>
SQL> CREATE UNIQUE INDEX TEMP_T1_U1 ON TEMP_T1(OBJECT_ID);
Index created.
SQL>
SQL> CREATE UNIQUE INDEX TEMP_T2_U1 ON TEMP_T2(OBJECT_ID);
Index created.
SQL>
SQL> CREATE OR REPLACE VIEW TEMP_T1T2_V AS
2 SELECT * FROM TEMP_T1 UNION ALL SELECT * FROM TEMP_T2;
View created.
SQL>
SQL> CREATE OR REPLACE TYPE TEMP_OBJ_TYPE AS OBJECT (OBJ_ID NUMBER)
2 /
Type created.
SQL> CREATE OR REPLACE TYPE TEMP_OBJ_TAB_TYPE IS TABLE OF TEMP_OBJ_TYPE
2 /
Type created.
SQL> SET SERVEROUTPUT ON;
SQL>
SQL> DECLARE
2 TYPE TEMP_T1T2_V_ROW_TAB_TYPE IS TABLE OF TEMP_T1T2_V%ROWTYPE;
3 TEMP_T1T2_V_ROW_TAB TEMP_T1T2_V_ROW_TAB_TYPE;
4 TEMP_OBJ_TAB TEMP_OBJ_TAB_TYPE := TEMP_OBJ_TAB_TYPE();
5 PROCEDURE ADD_TO_TEMP_OBJ_TAB(OBJ_ID IN NUMBER) IS
6 BEGIN
7 TEMP_OBJ_TAB.EXTEND;
8 TEMP_OBJ_TAB(TEMP_OBJ_TAB.LAST) := TEMP_OBJ_TYPE(OBJ_ID);
9 END;
10 BEGIN
11 ADD_TO_TEMP_OBJ_TAB(100);
12 ADD_TO_TEMP_OBJ_TAB(116);
13 ADD_TO_TEMP_OBJ_TAB(279);
14 ADD_TO_TEMP_OBJ_TAB(364);
15 DBMS_OUTPUT.PUT_LINE('=====================');
16 FOR I IN TEMP_OBJ_TAB.FIRST..TEMP_OBJ_TAB.LAST
17 LOOP
18 DBMS_OUTPUT.PUT_LINE('OBJ_ID = '||TEMP_OBJ_TAB(I).OBJ_ID);
19 END LOOP;
20 DBMS_OUTPUT.PUT_LINE('---------------------');
21 SELECT * BULK COLLECT INTO TEMP_T1T2_V_ROW_TAB
22 FROM TEMP_T1T2_V VW
23 WHERE ((VW.OBJECT_ID) IN (SELECT OBJ_ID
24 FROM TABLE(CAST(TEMP_OBJ_TAB AS TEMP_OBJ_TAB_TYPE))));
25 FOR I IN TEMP_OBJ_TAB.FIRST..TEMP_OBJ_TAB.LAST
26 LOOP
27 DBMS_OUTPUT.PUT_LINE('OBJ_ID = '||TEMP_OBJ_TAB(I).OBJ_ID);
28 END LOOP;
29 DBMS_OUTPUT.PUT_LINE('---------------------');
30 IF TEMP_T1T2_V_ROW_TAB.COUNT > 0 THEN
31 FOR I IN TEMP_T1T2_V_ROW_TAB.FIRST..TEMP_T1T2_V_ROW_TAB.LAST
32 LOOP
33 DBMS_OUTPUT.PUT_LINE(TEMP_T1T2_V_ROW_TAB(I).OBJECT_ID||' : '||TEMP_T1T2_V_ROW_TAB(I).OBJECT_NAME);
34 END LOOP;
35 ELSE
36 DBMS_OUTPUT.PUT_LINE('NO ROWS RETURNED!');
37 END IF;
38 DBMS_OUTPUT.PUT_LINE('---------------------');
39 END;
40 /
=====================
OBJ_ID = 100
OBJ_ID = 116
OBJ_ID = 279
OBJ_ID = 364
OBJ_ID = 100
OBJ_ID = 116
OBJ_ID = 279
OBJ_ID = 364
364 : I_AUDIT
364 : I_AUDIT
364 : I_AUDIT
364 : I_AUDIT
PL/SQL procedure successfully completed.
SQL> column object_name format a30
SQL> select object_id,
2 object_name
3 from dba_objects
4 where object_id in (100,116,279,364)
5 /
OBJECT_ID OBJECT_NAME
100 ORA$BASE
116 DUAL
279 MAP_OBJECT
364 I_AUDIT
SQL> Works fine in:
=====================
OBJ_ID = 100
OBJ_ID = 116
OBJ_ID = 279
OBJ_ID = 364
OBJ_ID = 100
OBJ_ID = 116
OBJ_ID = 279
OBJ_ID = 364
100 : ORA$BASE
116 : DUAL
364 : SYSTEM_PRIVILEGE_MAP
279 : MAP_OBJECT
PL/SQL procedure successfully completed.
SQL> select object_id,
2 object_name
3 from dba_objects
4 where object_id in (100,116,279,364)
5 /
OBJECT_ID OBJECT_NAME
100 ORA$BASE
116 DUAL
364 SYSTEM_PRIVILEGE_MAP
279 MAP_OBJECT
SQL> select *
2 from v$version
3 /
BANNER
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for 32-bit Windows: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
SQL>SY.
Edited by: Solomon Yakobson on Oct 30, 2012 2:14 PM -
Report which concatenates 13 views with union all running slowly
Oracle 8.1.7 windows 2000 server
I am trying to improve the performance of a report which is comprised of 13 views.
When I run each of the views individually, the total run time for the views is less than 5 minutes. When I run the report, it takes 28 minutes.
Can anyone suggest why the extra time is being taken?
To reiterate:
select a,b from c; (executes in 10 seconds)
select d, e from f (executes in 3 seconds)
select x, y from z (executes in 1 minute)
total runs time = 5 minutes
However,
select a,b from c
union all
select d, e from f
union all
select x, y from z (executes in 28 minutes)
The execution plans do not change between the report and the indiividual views. Views are being concatenated with union all so no sorting is taking place
Many thanks,
Jason Parker.
Edited by: jclparker on Feb 18, 2009 4:26 AM
Edited by: jclparker on Feb 18, 2009 4:30 AMCould you post the execution plan? Please use formatting tags to save the white space while posting the plan.
-
Materalized view with union all and fast referesh
I have a one view which is very slow. in this view we are joining many tables and many union all queries.
now I am planing to make materalized view
Tell me how i will created view with fast refresh with union all query.
Pls help its urgent..
Thanks
ReenaRefer to the Replication Manual for the create syntax and exceptions.
-
Updatable Materialized View with Union ALL
(please don't ask about db structure)
DB: 11gR2
create table table_1 (
id number primary key,
val varchar2(100)
create table table_2 (
id number primary key,
val varchar2(100)
insert into table_1(id) values (0);
insert into table_1(id) values (2);
insert into table_1(id) values (3);
insert into table_1(id) values (4);
insert into table_1(id) values (5);
insert into table_2(id) values (10);
insert into table_2(id) values (12);
insert into table_2(id) values (13);
insert into table_2(id) values (14);
insert into table_2(id) values (15);
update table_1 set val='Table1 val:'||id;
update table_2 set val='Table2 val:'||id;
create view v_table_all as
select * from table_1
view V_TABLE_ALL created.
select * from v_table_all;
ID VAL
0 Table1 val:0
2 Table1 val:2
3 Table1 val:3
4 Table1 val:4
5 Table1 val:5
select column_name, updatable, insertable, deletable
from user_updatable_columns
where table_name = 'V_TABLE_ALL'
COLUMN_NAME UPDATABLE INSERTABLE DELETABLE
ID YES YES YES
VAL YES YES YES
update v_table_all set val='XXX changed' where id = 3;
1 row updated.
select * from table_1;
ID VAL
0 Table1 val:0
2 Table1 val:2
3 XXX changed
4 Table1 val:4
5 Table1 val:5
rollback;
select * from table_1;
ID VAL
0 Table1 val:0
2 Table1 val:2
3 Table1 val:3
4 Table1 val:4
5 Table1 val:5
create or replace view v_table_all as
select * from table_1
union select * from table_2;
view V_TABLE_ALL created.
select * from v_table_all;
ID VAL
0 Table1 val:0
2 Table1 val:2
3 Table1 val:3
4 Table1 val:4
5 Table1 val:5
10 Table2 val:10
12 Table2 val:12
13 Table2 val:13
14 Table2 val:14
15 Table2 val:15
select column_name, updatable, insertable, deletable
from user_updatable_columns
where table_name = 'V_TABLE_ALL'
COLUMN_NAME UPDATABLE INSERTABLE DELETABLE
ID NO NO NO
VAL NO NO NO
trying update:
update v_table_all set val='XXX changed' where id = 3;
SQL-Fehler: ORA-01732: Datenmanipulationsoperation auf dieser View nicht zulässig
01732. 00000 - "data manipulation operation not legal on this view"
*Cause:
*Action:
drop view v_table_all;
view V_TABLE_ALL dropped.all is ok before this point.
now we want create a new materialized view with some query
create materialized view v_table_all
as
select * from table_1
union all select * from table_2 ;
materialized view V_TABLE_ALL created.
select column_name, updatable, insertable, deletable
from user_updatable_columns
where table_name = 'V_TABLE_ALL'
COLUMN_NAME UPDATABLE INSERTABLE DELETABLE
ID YES YES YES
VAL YES YES YES it seems to be ok with update.
but...
update v_table_all set val='XXX changed' where id = 3;
SQL-Fehler: ORA-01732: Datenmanipulationsoperation auf dieser View nicht zulässig
01732. 00000 - "data manipulation operation not legal on this view"
*Cause:
*Action:How can solve this issue??
Any suggestionLooks like user_updatable_columns sort of thinks the MV is just a table - I don't know about that...
An MV on a single table can be updated - I tried that and it works:
create materialized view mv_table_1 for update
as
select * from table_1;I noticed [url http://download.oracle.com/docs/cd/E11882_01/server.112/e16579/advmv.htm#sthref294]examples stating the UNION ALL needs a "marker" so Oracle can know from the data which source table a row in the MV originates from - like this:
create materialized view v_table_all for update
as
select 'T1' tab_id, table_1.* from table_1
union all
select 'T2' tab_id, table_2.* from table_2 ;But that also fails (the "marker" requirement was specifically for FAST REFRESH, so it was just a long shot ;-) )
What are you planning to do?
<li>Create the MV.
<li>Update records in the MV - which then is no longer consistent with the source data.
<li>Schedule a complete refresh once in a while - thereby overwriting/losing the updates in the MV.
If that is the case, I suggest using a true table rather than an MV.
<li>Create table t_table_all as select ... .
<li>Update records in the table - which then is no longer consistent with the source data.
<li>Schedule a job to delete table and insert into table select ... once in a while - thereby overwriting/losing the updates in the table.
In other words a kind of "do it yourself MV".
I cannot see another way at the moment? But perhaps try in the data warehousing forum - the people there may have greater experience with MV's ;-) -
Oracle doc inconsistent on materialize view with union all and self joins
First of all, I can't seem to create a materialized view containing self-joins AND union all. Is it possible?
I checked Oracle 9i (my version: PL/SQL Release 9.2.0.4.0 - Production) documentation and I get different answers (or so it seems to me).
First I saw this: "The COMPATIBILITY parameter must be set to 9.0 if the materialized aggregate view has inline views, outer joins, self joins or grouping sets and FAST REFRESH is specified during creation..."
Did you see the part about 'self joins' in there? I did and I was pumped because that seems to say that you CAN have 'self joins' (and my compatibility is 9.2...)
BUT
In the very same document I also found "Oracle does not allow self-joins in materialized join views." (rage)
You can see the document I am speaking of here: http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96520/mv.htm#574889
Whenever I try to create the mview I get the following error. (
In any caseORA-01446 cannot select ROWID from view with DISTINCT, GROUP BY, etc.First of all, I can't seem to create a materialized view containing self-joins AND union all. Is it possible?
I checked Oracle 9i (my version: PL/SQL Release 9.2.0.4.0 - Production) documentation and I get different answers (or so it seems to me).
First I saw this: "The COMPATIBILITY parameter must be set to 9.0 if the materialized aggregate view has inline views, outer joins, self joins or grouping sets and FAST REFRESH is specified during creation..."
Did you see the part about 'self joins' in there? I did and I was pumped because that seems to say that you CAN have 'self joins' (and my compatibility is 9.2...)
BUT
In the very same document I also found "Oracle does not allow self-joins in materialized join views." (rage)
You can see the document I am speaking of here: http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96520/mv.htm#574889
Whenever I try to create the mview I get the following error. (
In any caseORA-01446 cannot select ROWID from view with DISTINCT, GROUP BY, etc. -
Error creating materilalized view with union all
Could please anybody advice? What I do wrong?
create table test
i number not null,
constraint pk_test primary key( i ));
create materialized view log on test with rowid;
create materialized view mvtest refresh fast on demand as
SELECT i, 1 umarker FROM test where i < 10000
UNION ALL SELECT i, 2 umarker FROM test where i > 10000;
ORA-12052: cannot fast refresh materialized view MVTEST
It looks like I accomplished all fast refresh requirements, didn't I?
Thanks a lot.
Alexander.SQL> create table test
2 (i number not null,
3 constraint pk_test primary key( i ));
Table created.
SQL> create materialized view log on test with rowid;
Materialized view log created.
SQL> create materialized view mvtest refresh fast on demand as
2 SELECT t.i, 1 umarker, t.rowid row_id FROM test t where t.i <= 10000
3 UNION ALL
4 SELECT t.i, 2 umarker, t.rowid row_id FROM test t where t.i > 10000;
Materialized view created.(This is on 11.2) -
Two very different results using the same settings (H.264 / Quicktime Pro)
I’m a bit confused, I have used Quicktime Pro (v7.1) to encode DV into H.264 for iPod and this particular video is 18 minutes long and came out looking very good with the following settings;
VIDEO: H.264 at 200kbps, Baseline Profile, 25fps, Auto Key Frames, 320x240 or 640x480, Multipass Best quality encoding.
AUDIO: AAC Audio at 96kbps, 24kHz sampling freq, Stereo.
However here is the twist…
When I use the same exact settings to encode just the 30 second opener (from the 18 minute video) the encoded opener looks bad and blocky!
Why? Same settings would make you assume that you should get a same or similar result, or am I wrong?
The reason I have tried encoding this 30 second opener is that I am trying to work out which settings work best on the iPod (another issue) and I don’t want to spend hours test encoding the full 18 minute video, as you know H.264 is SLOW to encode!
So can anyone help in regard to two very different results using the same settings?
Regards,
J
PC Windows XPAlvin,
Is it a commercially-released or home-burned CD?
If it's commercially-released, try "encouraging" the recalcitrant computer by using the iTunes Advanced menu > Get CD Track Names command when it shows Audio CD.
If it's home-burned, you will find that only the computer that actually burned the disc will know what's on it. The information won't be transferred to another computer.
Let us know which, if either, of these situations applies to you. -
I purchased songs from 2 different computers using itunes with the same apple id. I had 1 iPod I used for these but I just recently got an iPhone and I was wondering why it wasn't letting me put my purchased songs on my iPhone?
You can transfer iTunes content from an iTunes library on a single computer only.
Since these songs were purchased with the same iTunes account, you can download the song that is not in your iTunes library on the computer you will be syncing your iPhone with. Or you can download the song or songs direct on your iPhone.
http://support.apple.com/kb/HT2519?viewlocale=en_US&locale=en_US -
Please explain
why to use view WITH OBJECTHi,
Please have a look the below link:
http://download-uk.oracle.com/docs/cd/B19306_01/server.102/b14220/objects.htm
Regards -
Using SCORE on top of View with UNION
Hi guys,
I explain what I'm trying to do quickly:
2 Tables: table1 and table2 with same structure and both have a multi_column_datastore ctxsys.context.
1 View: view1
select * from table1
union
select * from table2
if I run:
select * from view1 WHERE contains(view1.COLUMN1,'%textext%',1 ) > 0;
this works fine, I get the correct result.
If I try to use SCORE function I have an error:
select * from view1 WHERE contains(view1.COLUMN1,'%textext%',1 ) > 0 ORDER by SCORE(1);
ORA-29921: Ancillary operator not supported with set view query block
I understand the problem is in the UNION inside the view,is there any way to make it works keep filtering the VIEW?
Thanks in advanceThere is no score in the view, so you can't reference the score when querying the view. In order to put the score in the view, you need a contains clause, which requires a value. One method of doing this is to use sys_context. Please see the reproduction of the problem and solution below.
SCOTT@orcl12c> -- reproduction of problem:
SCOTT@orcl12c> create table table1
2 (column1 varchar2(30))
3 /
Table created.
SCOTT@orcl12c> insert into table1 values ('textext')
2 /
1 row created.
SCOTT@orcl12c> create table table2
2 (column1 varchar2(30))
3 /
Table created.
SCOTT@orcl12c> insert into table2 values ('textext')
2 /
1 row created.
SCOTT@orcl12c> begin
2 ctx_ddl.create_preference ('test_ds', 'multi_column_datastore');
3 ctx_ddl.set_attribute ('test_ds', 'columns', 'column1');
4 end;
5 /
PL/SQL procedure successfully completed.
SCOTT@orcl12c> create index table1_idx on table1 (column1)
2 indextype is ctxsys.context
3 parameters ('datastore test_ds')
4 /
Index created.
SCOTT@orcl12c> create index table2_idx on table2 (column1)
2 indextype is ctxsys.context
3 parameters ('datastore test_ds')
4 /
Index created.
SCOTT@orcl12c> create or replace view view1
2 as
3 select * from table1
4 union
5 select * from table2
6 /
View created.
SCOTT@orcl12c> select * from view1 where contains (view1.column1, '%textext%', 1) > 0
2 /
COLUMN1
textext
1 row selected.
SCOTT@orcl12c> select * from view1 where contains (view1.column1,'%textext%',1 ) > 0 order by score(1)
2 /
select * from view1 where contains (view1.column1,'%textext%',1 ) > 0 order by score(1)
ERROR at line 1:
ORA-29921: Ancillary operator not supported with set view query block
SCOTT@orcl12c> -- solution:
SCOTT@orcl12c> create or replace view view1
2 as
3 select score(1) score, table1.* from table1
4 where contains (table1.column1, sys_context ('text_query', 'query_value'), 1) > 0
5 union
6 select score(1) score, table2.* from table2
7 where contains (table2.column1, sys_context ('text_query', 'query_value'), 1) > 0
8 /
View created.
SCOTT@orcl12c> create or replace context text_query using text_proc
2 /
Context created.
SCOTT@orcl12c> create or replace procedure text_proc
2 (p_val in varchar2)
3 as
4 begin
5 dbms_session.set_context ('text_query', 'query_value', p_val);
6 end text_proc;
7 /
Procedure created.
SCOTT@orcl12c> exec text_proc ('%textext%')
PL/SQL procedure successfully completed.
SCOTT@orcl12c> set autotrace on explain
SCOTT@orcl12c> select * from view1 order by score
2 /
SCORE COLUMN1
3 textext
1 row selected.
Execution Plan
Plan hash value: 4090246122
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 2 | 60 | 8 (0)| 00:00:01 |
| 1 | SORT ORDER BY | | 2 | 60 | 8 (0)| 00:00:01 |
| 2 | VIEW | VIEW1 | 2 | 60 | 8 (0)| 00:00:01 |
| 3 | SORT UNIQUE | | 2 | 58 | 8 (50)| 00:00:01 |
| 4 | UNION-ALL | | | | | |
| 5 | TABLE ACCESS BY INDEX ROWID| TABLE1 | 1 | 29 | 4 (0)| 00:00:01 |
|* 6 | DOMAIN INDEX | TABLE1_IDX | | | 4 (0)| 00:00:01 |
| 7 | TABLE ACCESS BY INDEX ROWID| TABLE2 | 1 | 29 | 4 (0)| 00:00:01 |
|* 8 | DOMAIN INDEX | TABLE2_IDX | | | 4 (0)| 00:00:01 |
Predicate Information (identified by operation id):
6 - access("CTXSYS"."CONTAINS"("TABLE1"."COLUMN1",SYS_CONTEXT('text_query','query_v
alue'),1)>0)
8 - access("CTXSYS"."CONTAINS"("TABLE2"."COLUMN1",SYS_CONTEXT('text_query','query_v
alue'),1)>0)
Note
- dynamic statistics used: dynamic sampling (level=2)
SCOTT@orcl12c> -
Strange behaviour of view based on several tables join with union all
Dear fellows we r facing a strange problem we have a view based on several tables joined by union all ,when we issue an ordered query on date,rows returned are unusually different than they should be .
Is oracle has some special behaviour for view based on union all ?
I m using oracle 8.1.6 on windows 2000
Kashif SohailDid you ever solve this problem? I have two select statements based on 4 tables and 3 views using about 5 more tables. When I execute each select individually I get exactly what is expected. When I UNION ALL both selects together, I get "no rows returned", however when I UNION them I get exactly what is expected. I should get the same answer for both UNION ALL and UNION. The two select statements are identical, except for one column where I changed the constant to be different. Any thoughts?
-
Probelm with Union all in view
I'm tring to create a view by using the following:
SELECT MASTER_IDX.MASTER_IDX_ID, CREATE_BY AS PERSON, CREATE_DATE AS WORKDATE, 'CREATE' AS WORKTYPE
FROM MASTER_IDX
WHERE CREATE_BY <> 'IQS'
UNION ALL
SELECT MASTER_IDX.MASTER_IDX_ID, INDEX_BY AS PERSON, INDEX_DATE AS WORKDATE, 'INDEX' AS WORKTYPE
FROM MASTER_IDX
WHERE INDEX_BY <> 'IQS'
UNION ALL
SELECT MASTER_IDX.MASTER_IDX_ID, VER_BY AS PERSON, VER_DATE AS WORKDATE, 'INDEX' AS WORKTYPE
FROM MASTER_IDX
WHERE VER_BY <> 'IQS'
UNION ALL
SELECT MASTER_IDX.MASTER_IDX_ID, MOD_BY AS PERSON, MOD_DATE AS WORKDATE, 'INDEX' AS WORKTYPE
FROM MASTER_IDX
WHERE MOD_BY <> 'IQS'
UNION ALL
SELECT MASTER_IDX.MASTER_IDX_ID, MAILBACK_BY AS PERSON, MAILBACK_DATE AS WORKDATE, 'INDEX' AS WORKTYPE
FROM MASTER_IDX
WHERE MAILBACK_BY <> 'IQS'
UNION ALL
SELECT IDX_IMAGE.MASTER_IDX_ID, SCANNED_BY AS PERSON , SCANNED_DATETIME AS WORKDATE, 'SCANNED' AS WORKTYPE
FROM IDX_IMAGE
WHERE SCANNED_BY <> 'IQS'
when I run this in the sql developer environment I get the results that I expect. When I try to put this into a view I get this error:
java.lang.NullPointerException
Can anyone please look at this and give me a clue as to what i'm doing worng?
Thanks!Can you give a bit more detail about which SQL Developer version you are using, what you mean by "put this into a view" (using the "New View ..." window?) and just what you were doing when you got the NPE (ie Test Syntax or OK to create or something else)?
theFurryOne -
Syntax Error - Using "Group By" with "Union All"
Dear SAP community, I am a newb in need of help.
Just spent the past 2 days searching for answers on how to build this query.
Basically, I just want to group the Item Names (U_ItemName) together and have their respective quantities (U_Cart) added together so the same items display as one total quantity, no duplicates.
I have tried so many combinations of GroupBy and Sum/Count....etc. Nothing is working.
The query:
SELECT T1.[U_ItemName] AS 'Item Name', T1.[U_Cart] AS 'Cartons Available', T0.[Country] AS 'Country', T1.[U_ShlfLife] AS 'Shelf Life' FROM [dbo].[OWHS] T0 inner join [dbo].[@SICAS_EXT_WHS] T1 on T0.WhsCode=T1.U_WhseCode WHERE T0.[Country] = (N'JP' ) and DateDiff(Month, GetDate(),T1.[U_ShlfLife]) <= 6 union all
SELECT T0.[U_ItemName], Sum(T0.[U_Cart]) as Cartons, T1.[Country], null FROM [dbo].[@SICAS_EXT_WHS] T0, OWHS T1 WHERE T1.[Country] = (N'JP' ) and DateDiff(Month, GetDate(),T0.[U_ShlfLife]) >= 6
GROUP BY T0.[U_ItemName], T0.[U_Cart], T1.[Country]
Can anybody advise how to get this working?
Thank you,
Justice Nerenberghi justice,
I checked your code and it seems correct. but I don't have same table in database so i can't check it correctly.
but I tried your problem with same situation and I am getting actual result.
Example :-
select itemcode,dscription,quantity from inv1
where docdate>'2011-02-18 00:00:00.000'
union all
select itemcode,dscription,Sum(quantity) from inv1
where docdate<'2011-02-18 00:00:00.000'
group by itemcode,dscription
Please do one thing rum both select queries separately whether running properly. Using above example you can check your code
Thanks
Annu -
Using timestamp in union all view
I am having a silly problem with one of my views. It is a union all with two select statements. There is a timestamp(6) in one select but not in the other so I have a to_timestamp(null) to match up the columns.
The problem is that no matter how I code the to_timestamp(null,fmt) the structure of the view is always timestamp(0). I even changed the 2nd select so that it uses a timestamp(6) column. If I create 2 views from both selects they have the correct syntax but as soon as I use a union the timestamp loses it precision.
When I acutally do a select from the view I can still see the milliseconds precision. My real problem occurs in that I have a ref cursor that is of type view_row%rowtype. When I select into the cursor I lose the precision.
Any ideas?
thxUse the cast function to cast the timestamp to timestamp(6)
SQL> create table t
2 ( id number
3 , ts timestamp(6)
4 );
Table created.
SQL> create view v
2 as
3 select id, ts
4 from t
5 union all
6 select 0, cast(to_timestamp(null) as timestamp(6))
7 from dual;
View created.
SQL> desc v
Name Null? Type
ID NUMBER
TS TIMESTAMP(6)
SQL> insert into t
2 values (1,systimestamp);
1 row created.
SQL> select * from v;
ID
TS
1
31-AUG-04 02.28.38.342412 PM
0
Maybe you are looking for
-
I am working on the following query SELECT report_date, EXTRACT (MONTH FROM report_date) FROM program_details; SELECT a.customer_id, a.report_date as change_date FROM program_details AS a LEFT JOIN program_details AS b on a. customer_id = b. customer
-
How to get self in a JDialog button action method?
The following code is written in the init() of a JDialog(jdialog1). I want to create another JDialog(jdialog2) when the user clicks a button in jdialog1. but i couldn't get jdialog1 itself to form the parameters of creating jdialog2. i.e. 'this' in t
-
How to convert a analog signal to digital signal
Hello, How to convert an analog signal into digital signal such that every sample of analog signal corresponding to 1.2V will be represented as '1' in digital signal and other samples of analog signal(that are not 1.2v) will be represented(converted)
-
Cancelling BT landline because it is too expensive
I just received my BT landline bill today and it is £65.21 despite the fact that I used it very little over the past 3 months. This is because of the advanced line rental so I have decided to cancel my landline rather than keep paying for something
-
Hi, Just downloaded trial of PSE 11. I have PSE 10. I can have two different photos or projects open in my workspace at the same time in PSE 10. How can I do that in PSE 11? Thanks so much