Sdo_cs.transform procedure in a materialized view
Hi all,
Oracle version :10.2.0.4
I am trying to do perform reprojection in a materialised view ( refresh on demand, complete mode).
It seems everytime I refresh the MV ,this error pops up.
SQL> exec dbms_mview.refresh('SUPER', 'C');
BEGIN dbms_mview.refresh('SUPER', 'C'); END;
ERROR at line 1:
ORA-12008: error in materialized view refresh path
ORA-06531: Reference to uninitialized collection
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2251
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2457
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2426
ORA-06512: at line 1
<code>
CREATE MATERIALIZED VIEW "SUPER" ORGANIZATION HEAP PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "DATA_DATA" BUILD DEFERRED USING INDEX REFRESH COMPLETE ON DEMAND USING DEFAULT LOCAL ROLLBACK SEGMENT DISABLE QUERY REWRITE
AS
SELECT seq_nextval AS PID,
SITE,
STATE,
reproject(geoloc)
FROM BJON;
<code>
The procedure of reproject
create or replace
FUNCTION "REPROJECT" (p_coordinates in SDO_GEOMETRY)
return SDO_GEOMETRY deterministic
as v_coordinates SDO_GEOMETRY;
BEGIN
v_coordinates := sdo_cs.transform (p_coordinates, 4326);
RETURN v_coordinates;
end REPROJECT;
Can anyone let me know hw I can put plug thereprojection in a materialized view.
Edited by: CrackerJack on May 2, 2012 11:00 PM
Hi all,
Any clues?
I have died of anymore ideas to make this work.
All I need is a updated table with
Primary key ,
GEOMETRY 4326
spatial index.
metadata
Teh materialized view is perfect except I can't do the reprojections.
ORA-06531: Reference to uninitialized collection means have some null values in the array , but if you remove the Reproject function and just geometry itself , the materialised view works brilliant.
I tried converting to 0,0 point in the function to tackle the nulls in array if any.. but doesn't work.
sdo_cs.transform(nvl(geoloc, mdsys.sdo_geometry(2001, 8307, mdsys.sdo_point_type(0,0,NULL),NULL,NULL)),82027).get_wkt()
Any ideas is much appreciated.
Edited by: CrackerJack on May 6, 2012 10:27 PM
Similar Messages
-
Cannot create Materialized View using PL/SQL procedure
Hello,
I have a question related to Materialized View creation.
I have a stored procedure that creates materialized view. When trying to run this procedure I get insufficient privileges error: ORA-01031.
When I run content of this procedure as anonymous PL/SQL block them materialized view is created without any complications.
Can you please advice me on that topic?
Is it even possible to create materialized view in stored procedure as I haven't found an info on it.
Thanks
PetrHi chudapet,
Whenever you do operation in procedure you need to have direct grants and not via a role.
Most probably the grant to create materialized view is available via a role to your user.
Assign direct grant to the user:
grant create materialized view to scott;
{code} -
ORA-01555 when performing refresh of materialized views via DBMS_JOB
All,
With this project needing to be finished soon and an issue occuring on the local database, I am hopefuly one of you will have the answer or resolution so that I may complete this project soon....
Here is the setup..
10g database (remote)
9i database (local
DB Link from local to remote database
103 materialized views in local database that are refreshed by pulling data from dblink to remote database.
A PL/SQL procedure has been created which sets the v_failures variable = 0 and then performs a check to see if the current job has a failure and if so, inserts that value into the v_failures variable. When that reaches "1", then the procedure does nothing and closes out. If the failures are equal to "0" then it performs a DBMS_MVIEW.REFRESH procedure for each materialized view.
This worked the first time but its continually failing now with the ORA-01555 error (snapshot too old). From what I can tell, the dbms_job duration is 4 seconds and the Last_Exec is 2m 7s after it starts (8:30 PM). With that said, our DBAs working o nthe project have increased the Undo_Retention settings and assure us that shouldn't be the problem. Odd thing is, this never happened in the dev environment when we were developing/testing - only in the production environment once it got migrated.
I am looking for possible causes and possible solutions to the ORA-01555 error. A sample of the code in my procedure is below:
CREATE OR REPLACE PROCEDURE Ar_Mviews IS
V_FAILURES NUMBER := 0;
BEGIN
BEGIN
SELECT FAILURES INTO V_FAILURES FROM USER_JOBS WHERE SCHEMA_USER = 'CATEBS' AND WHAT LIKE '%DISCO_MVIEWS%';
IF V_FAILURES = 1 THEN NULL;
ELSE
DBMS_MVIEW.REFRESH ('AR_BATCH_RECEIPTS_V', 'C');
DBMS_OUTPUT.PUT_LINE(V_FAILURES); END IF;
END;
BEGIN
SELECT FAILURES INTO V_FAILURES FROM USER_JOBS WHERE SCHEMA_USER = 'CATEBS' AND WHAT LIKE '%DISCO_MVIEWS%';
IF V_FAILURES = 1 THEN NULL;
ELSE
DBMS_MVIEW.REFRESH ('AR_BATCHES_ALL_V', 'C');
DBMS_OUTPUT.PUT_LINE(V_FAILURES); END IF;
END;
END Ar_Mviews;
---------------------------------------------------------------------------------------------------------------We are doing complete refreshes and doing it that way for consistency in the data presented. Because some materialized views are dependent upon data in other materialized views, we have them ordered in a procedure so that when one finishes, the next starts and they are also in a specific order as to ensure accurate data.
The condition for v_failures is done so that the job doesn't get, lets say, 90% finished and hit an error and start over again. We do the IF statement which results in NULL (do nothing) so that the job doesn't repeat itself over and over again. If one MV fails, we have to consider the job a failure and do nothing else because the one MV that failed may have been a dependency of another MV down the line. (i.e. MV7 calls MV3 and MV3 fails, so the whole job fails because MV7 can't be accurate without the most current data from MV3).
As well, this is being performed in off-business hours after backup to tape, etc. and prior to start of business so that no one is using the system when we run this job. That won't always be the case when we move to high availability with this system for varying time-zone end-users.
I hope I have answered your question and look forward to continued feedback.
Thanks! -
Transform 3D to 2D Data via a Materialized View
Hi,
I'm playing with Geoserver against an Oracle Locator database. Things are starting well, but I did notice a bug where 3D points and lines are not supported. I guess this is an issue with GeoTools. Anybody have a way to transform my 3D data to 2D. Since I do use the 3rd dimension for storing elevation, I don't want to lose the data. So I was thinking that I could create materialized views to "virtually strip" the 3rd dimension. Any thoughts? I'm not very strong in PL/SQL, so any code hints would be greatly appreciated as well.
Thanks!
JeffI would say the compiled pl/sql would be faster (it would also depend on whether you compiled to the pl/sql virtual machine code - MP-code or the machine-dependent code of the host's C compiler if you chose native copilation): I am coding a Java version of my GEOM.SDO_CENTROID function so will be in a better position to say, categorically, one way or the other.
In my free pl/sql packages there are these functions in case anyone is interested:
-- @function To_2D
-- @precis Converts a 3D geometry to a 2D geometry
-- @version 2.0
-- @usage v_2D_geom := geom.To_2D(MDSYS.SDO_Geometry(3001,....)
-- @history Albert Godfrind, July 2006, Original Coding
-- @history Bryan Hall, July 2006, Modified to handle points
-- @history Simon Greener, July 2006, Integrated into geom with GF.
Function To_2D( p_3D_geom IN MDSYS.SDO_Geometry )
Return MDSYS.SDO_Geometry deterministic;
-- @function To_3D
-- @precis Converts a 2D geometry to a 3D geometry
-- @version 1.0
-- @usage v_3D_geom := geom.To_3D(MDSYS.SDO_Geometry(2001,....),50)
-- @history Simon Greener, May 2007 Original coding
Function To_3D( p_2D_geom IN MDSYS.SDO_Geometry,
p_default_z IN NUMBER := NULL)
Return MDSYS.SDO_Geometry deterministic;
/** @Function : FIX_3D_Z
** @Precis : Checks the Z ordinate in the SDO_GEOMETRY and if NULL changes to p_default_z value
** @Note : Needed as MapServer appears to not handle 3003/3007 polygons with NULL Z values in the sdo_ordinate_array
** @History : Simon Greener - JUNE 4th 2007 - Original Coding
Function Fix_3D_Z( p_3D_geom IN MDSYS.SDO_Geometry,
p_default_z IN NUMBER := -9999 )
Return MDSYS.SDO_Geometry Deterministic;
/** Function just to change a single point coded in sdo_ordinates to sdo_point representation
* @param p_geometry A sdo_geometry object.
Function ToSdoPoint ( p_geometry in MDSYS.SDO_Geometry )
return MDSYS.SDO_Geometry Deterministic;Simon -
How to use materialized view in stored procedure
in my stored procedure I use couple of queries (see the script below). I want to create materialized views to replace these queries. Is it possible to achieve and how to achieve it in my case? thanks in advance
set serveroutput on
DECLARE
v_cur_tid NUMBER(5):=0;
v_cur_cs_attendance NUMBER(5):=0;
v_cur_c_tot_enrolments NUMBER(5):=0;
v_most_enrolments NUMBER(5):=0;
v_least_enrolments NUMBER(5):=0;
v_most_pop_cid NUMBER(5):=0;
v_least_pop_cid NUMBER(5):=0;
CURSOR class_cursor IS
select
id,
name,
max_attendees
from
class
where
id in (select distinct(event_id) from trainer_schedule where event_type='c' and is_active='y')
order by id;
BEGIN
DBMS_OUTPUT.PUT_LINE('==================================================================================================================================');
--print the report header
DBMS_OUTPUT.PUT_LINE('Summary Report No.3: Training Class Active Schedules Summary Report');
FOR r_class IN class_cursor LOOP
--print the header or subsection
select sum(enrolments) into v_cur_c_tot_enrolments from class_schedule where class_id = r_class.id;
IF v_most_enrolments < v_cur_c_tot_enrolments OR v_most_enrolments = 0
THEN v_most_enrolments := v_cur_c_tot_enrolments; v_most_pop_cid := r_class.id;
END IF;
IF v_least_enrolments > v_cur_c_tot_enrolments OR v_least_enrolments = 0
THEN v_least_enrolments := v_cur_c_tot_enrolments; v_least_pop_cid := r_class.id;
END IF;
DBMS_OUTPUT.PUT_LINE('******************************************************************************************');
DBMS_OUTPUT.PUT_LINE('CLASS_ID: ' || r_class.id ||' '|| 'CLASS_NAME: ' || r_class.name ||' '||'CAPACITY: ' || r_class.max_attendees ||' '||'TOTAL_ENROLMENTS: ' || v_cur_c_tot_enrolments);
DBMS_OUTPUT.PUT_LINE(rpad('____________', 12) || lpad('____________', 12) || lpad('____________________', 20) || lpad('____________________', 20) || lpad('____________',12) || lpad('____________',12));
DBMS_OUTPUT.PUT_LINE(rpad('SCHEDULE_ID', 12) || lpad('TRAINER_ID',12) || lpad('START_TIME', 20) || lpad('END_TIME',20) || lpad('ENROLMENTS',12) || lpad('ATTENDANCE',12));
DBMS_OUTPUT.PUT_LINE(rpad('____________', 12) || lpad('____________',12) || lpad('____________________', 20) || lpad('____________________', 20) || lpad('____________',12) || lpad('____________',12));
FOR r_cs IN (select id,to_char(start_time,'DD-MM-YYYY HH24:Mi') as start_time, to_char(end_time,'DD-MM-YYYY HH24:Mi') as end_time, enrolments from class_schedule where class_id = r_class.id order by id)
LOOP
select trainer_id into v_cur_tid from trainer_schedule where event_type='c' and event_id = r_cs.id;
select count(training_session.id) into v_cur_cs_attendance
from training_session, class_schedule
where training_session.attended = 'y' and
training_session.type='c'and
to_char(training_session.start_time,'DD-MM-YYYY HH24:Mi') = to_char(class_schedule.start_time,'DD-MM-YYYY HH24:Mi') and
class_schedule.id = r_cs.id;
DBMS_OUTPUT.PUT_LINE(rpad(r_cs.id, 12) || lpad(v_cur_tid,12) || lpad(r_cs.start_time, 20) || lpad(r_cs.end_time,20) || lpad(r_cs.enrolments,12) || lpad(v_cur_cs_attendance,12));
END LOOP;
END LOOP;
DBMS_OUTPUT.PUT_LINE('******************************************************************************************');
DBMS_OUTPUT.PUT_LINE('******************************************************************************************');
DBMS_OUTPUT.PUT_LINE('MOST_POPULAR_CLASS: '||v_most_pop_cid||' TOTAL_ENROLMENTS_TO_DATE: '||v_most_enrolments);
DBMS_OUTPUT.PUT_LINE('LEAST_POPULAR_CLASS: '||v_least_pop_cid||' TOTAL_ENROLMENTS_TO_DATE: '||v_least_enrolments);
DBMS_OUTPUT.PUT_LINE('==================================================================================================================================');
END;
/Hi,
you could use Dynamic SQL /Execute immediate to run DDL from a stored procedure.
http://download-uk.oracle.com/docs/cd/B10501_01/appdev.920/a96624/11_dynam.htm
Could you please tell why do you want to create a materialized view in stored procedure ?
How frequently you will runt this procedure . It would is better to create a MV once and use it.
thanks -
Query against materialized view from stored procedure brings back empty row
I have a stored procedure that runs a query against a materialized view. When I run the query outside the SP it works just fine. When I change the MV to a table name, the SP works. When I change it back to the MV i get an empty row. Any ideas? The code is below:
PROCEDURE getAuth (p_naid IN NUMBER,
p_scope IN VARCHAR2,
o_xml_data OUT SYS_REFCURSOR
) IS
BEGIN
IF p_scope = 'Approved' THEN
OPEN o_xml_data FOR
SELECT naid,
p_naid,
auth_type,
xml_data
FROM some_mv
WHERE naid = p_naid;
RETURN;
CLOSE o_xml_data;
... the rest of the procedure ...does procedure contain EXCEPTION handler?
if so, then remove, delete & eliminate EXCEPTION handler (at least during testing & debugging) -
ORA-01031 with materialized view in stored procedure
USER1 has created a materialized view (MV). The MV is owned by USER2. USER1 needs to query the MV from within a stored procedure. How do I avoid the ORA-01031?
Here's the illustration:
SQL> show user
USER is "USER1"
SQL> CREATE MATERIALIZED VIEW USER2.ROLL
2 BUILD IMMEDIATE
3 REFRESH COMPLETE WITH ROWID
4 ON DEMAND
5 AS
6 select * from user2.test_roll;
Materialized view created.
SQL> select status,owner,object_name,object_type where OBJECT_TYPE='MATERIALIZED VIEW';
STATUS OWNER OBJECT_NAME OBJECT_TYPE
VALID USER2 ROLL MATERIALIZED VIEW
SQL> select count(*) from user2.roll;
COUNT(*)
959485
SQL> declare
2 n number;
3 begin
4 select count(*)
5 into n
6 from user2.roll
7 where rownum<100;
8 dbms_output.put_line(n);
9* end;
SQL> /
99
PL/SQL procedure successfully completed.
SQL> create procedure test_mv is
2 n number;
3 begin
4 select count(*)
5 into n
6 from as400_snpsht.roll
7 where rownum<100;
8 dbms_output.put_line(n);
9 end;
10 /
Warning: Procedure created with compilation errors.
SQL> select text from user_errors where name like 'TEST_MV';
TEXT
PL/SQL: ORA-01031: insufficient privileges
PL/SQL: SQL Statement ignored
So the point is:
* Ad hoc sql works on the MV
* Anonymous pl/sql works on the MV
* Stored procedure fails compilation with ora-01031
Any suggestions are appreciated.Sorry; In may example 'as400_snpsht' should have been 'USER2' (the owner of the MV). I changed the real user names to USER1, USER2 to make the example clearer but missed that one.
I meant to say...
SQL> create procedure test_mv is
2 n number;
3 begin
4 select count(*)
5 into n
6 from user2.roll
7 where rownum<100;
8 dbms_output.put_line(n);
9 end;
10 /
Warning: Procedure created with compilation errors.
SQL> select text from user_errors where name like 'TEST_MV';
TEXT
PL/SQL: ORA-01031: insufficient privileges
PL/SQL: SQL Statement ignored -
Need to refresh materialized view from procedure and pl/sql block
Hi,
I need to refresh materialized view (complete refresh)from procedure and pl/sql block .can some one help.
MV name:MV_DGN_TEST_SESSION
Thanks,
Rajasekhardbms_mview.REFRESH ('MV_DGN_TEST_SESSION', 'C');Regards,
Mahesh Kaila
Edited by: user4211491 on Dec 1, 2009 10:41 PM -
How to create one procedure which can drop and create materialized view
Hi,
I want to create one pl/sql procedure which can first drop materialized view CATEGORY_PK and after that create same materialized view CATEGORY_PK.
programme is as follows:
DROP MATERIALIZED VIEW CATEGORY_PK;
CREATE MATERIALIZED VIEW CATEGORY_PK REFRESH FORCE WITH PRIMARY KEY AS
SELECT cav1.ownerid AS categoryid, p.uuid AS productid ,p.domainID AS productdomainid,pav.stringvalue AS NAME
,pav2.stringvalue AS ID, pav3.stringvalue AS SHORT
FROM product p, product_av pav, catalogcategory_av cav1, catalogcategory_av cav2,product_av pav2,product_av pav3
WHERE
cav1.NAME = 'PRODUCT_BINDING_ATTRIBUTE' AND
cav2.NAME = 'PRODUCT_BINDING_VALUE' AND
cav1.ownerid = cav2.ownerid AND
p.uuid = pav.ownerid AND
p.uuid = pav2.ownerid AND
p.uuid = pav3.ownerid AND
pav.NAME = cav1.stringvalue AND
pav2.NAME = cav1.stringvalue AND
pav2.NAME = cav1.stringvalue AND
pav.stringvalue = cav2.stringvalue AND
pav2.stringvalue = cav2.stringvalue AND
pav3.stringvalue = cav2.stringvalue
UNION
SELECT catalogcategoryid AS categoryid, productid, repdomainid AS productdomainid,pav1.stringvalue AS NAME
,pav2.stringvalue AS ID, pav3.stringvalue AS SHORT
FROM productcategoryassignment ,product_av pav1,product_av pav2,product_av pav3
WHERE pav1.ownerid=productid
AND pav2.ownerid=productid
AND pav3.ownerid=productid
AND pav1.NAME='name'
AND pav2.NAME='productID'
AND pav3.NAME='shortDescription';user498566 wrote:
I want to create one pl/sql procedure which can first drop materialized view CATEGORY_PK and after that create same materialized view CATEGORY_PK.That sounds like a waste of time and resources. What do you hope to achieve by this? A refresh? If so, a simple refresh of the old materialized view will do.
If you truly want to continue this road, you'll have to use the EXECUTE IMMEDIATE command to execute DDL commands from within PL/SQL.
Regards,
Rob. -
Memory Leak in Materialized View !!
Hi,
I'm facing memory leak problem while
creating/refreshing materialized view
with geometry object.
Platform Win NT 4.0
Oracle: 8.1.7.0.0
Details:
Step 1:
I'm converting lat/long (Point data) to cartesian using user defined albers projection.
Step 2:
Following is the function.
+++
create or replace function get_projected_long_lat (Long in Number,Lat in Number)
Return MDSYS.SDO_GEOMETRY
DETERMINISTIC
IS
LatDec Number;
LongDec Number;
Geom MDSYS.SDO_GEOMETRY := mdsys.sdo_geometry(null,null,null,null,null);
LatLongProj MDSYS.SDO_GEOMETRY;
Diminfo_array MDSYS.SDO_DIM_ARRAY := MDSYS.SDO_DIM_ARRAY(
MDSYS.SDO_DIM_ELEMENT('X', -79.5, -88, .00000005),
MDSYS.SDO_DIM_ELEMENT('Y', 24, 31.5,.00000005));
Begin
LongDec := -(substr(long,1,2) + substr(long,3,2) * (1/60) +
substr(long,5) * (1/60) * (1/60));
LatDec := (substr(lat,1,2) + substr(lat,3,2) * (1/60) +
substr(lat,5) * (1/60) * (1/60));
Geom.sdo_gtype := 2001;
Geom.sdo_srid := 8307;
Geom.sdo_point := NULL;
Geom.sdo_elem_info := mdsys.sdo_elem_info_array(1,1,1);
Geom.sdo_ordinates := mdsys.sdo_ordinate_array(LongDec,LatDec);
LatLongProj := SDO_CS.TRANSFORM(Geom, Diminfo_array, 600000);
Return(LatLongProj);
End get_projected_long_lat;
+++
Step 3:
Creating materialized view
++
CREATE MATERIALIZED VIEW GPTEST
BUILD IMMEDIATE
REFRESH COMPLETE START WITH SYSDATE NEXT SYSDATE + 1
WITH ROWID
AS
(select rownum sdo_gid,
get_projected_long_lat (a.longitude,a.latitude) geometry
from br@dblnk a, gr@dblnk b
++++
- Each time i refresh the view memory increase linearly, And I get the following error at some point after memory is full.
ERROR at line 9:
ORA-00600: internal error code, arguments: [kghfrf1], [0], [], [], [], [], [],
ORA-04030: out of process memory when trying to allocate 25100 bytes (pga
heap,control file cache)
ORA-04030: out of process memory when trying to allocate 16396 bytes (koh-kghu
sessi,kgmtgob)
ORA-04030: out of process memory when trying to allocate 16396 bytes (koh-kghu
sessi,kolcpcon kolcol)
ORA-04030: out of process memory when trying to allocate 16396 bytes (koh-kghu
sessi,kolcalm coll)
ORA-04030: out of process memory when trying to allocate 16396 bytes (koh-kghu
sessi,kolcalm coll)
or
*** 2001-07-25 15:07:42.087
ksedmp: internal or fatal error
ORA-04030: out of process memory when trying to allocate 33292 bytes (cursor work he,kllcqas:kllsltba)
ORA-04030: out of process memory when trying to allocate 20012 bytes (callheap,KQL tmpbuf)
ORA-04030: out of process memory when trying to allocate 16396 bytes (koh-kghu sessi,kolcalm coll)
Can anyone help??
Thanks
nullthis may be related to pl/sql memory leak. The bug number is 1371158, and it is fixed in 9i.
dan -
Materialized View Refresh; Process Flow
I was wondering if anyone has used process flow to refresh materialized view;
I am trying to use a process flow for this i.e. run something similiar to below
EXECUTE dbms_refresh.refresh('"ODW_SRC"."MV_SERVICE_DAILY_AUDIT"');
I am trying to avoid using DB scheduler because I want to make sure process flow doesn't clash with update of materialized view causing possible conflict of longer than expected job run time goes into refresh window.
I am assuming I could use a transformation and build it out; but I was wondering if there is an easier way in just executing this one line ... any idea's
Thank you in advance for your helpSorry, I think the OWB term is post mapping process, its actually an operator in an OWB mapping where you can add a procedure call for example. The procedure can do pretty much what it wants.
Cheers
David -
How can I fast refresh the materialized view !!
I created a MV base on some tables in order to improve the querey speed.
but the mv I have created falied to refresh fast.
because there are two same table in the from clause:
jcdm jc1,jcdm jc2
create materialized view temp_mv
nologging
pctfree 0
storage (initial 2048k next 2048k pctincrease 0)
parallel
build immediate
refresh force
on demand
as
select
TAB_GSHX.rowid hx_rid,
TAB_GSHD.rowid hd_rid ,
JC1.rowid jc1_rid ,
JC2.rowid jc2_rid ,
YSHD_ID HXID,
JC1.JCDM QFD,
JC2.JCDM JLD
FROM
TAB_GSHX,
TAB_GSHD,
jCDM JC1,
JCDM JC2
WHERE
YSHD_ID=YSHX_ID
AND YSHD_QFD=JC1.JBJC_ID
AND YSHD_JLD=JC2.JBJC_ID
AND TO_CHAR(YSHX_time,'YYYYMMDD')='20030101'
the column msgtxt of the table MV_CAPABILITIES_TABLE is :
"the multiple instances of the same table or view" and " one or more joins present in mv".
How can I succeed in fast refresh the above temp_mv!!!
thanks.lianjun,
When you are using Oracle9i there is a procedure which can help you setup the materialized view. If some option isn't working it gives you hint why it doesn't work.
The procedure is dbms_mview.explain_mview.
Take a look at the documentation how to use it. (In the Oracle9i DWH guide the package is explained.)
Hope this helps
With kind regards,
Bas Roelands -
Materialized View to run only once in a year...
Hi everybody...
I want to create a materialized view which will run only once in a year and specifically some minutes after 00:00 a.m. on new year's day,
so i created the following:
CREATE MATERIALIZED VIEW <mv_name>
BUILD IMMEDIATE
REFRESH START WITH TO_DATE('01/01/2007 00:15:00','DD/MM/RRRR HH24:MI:SS')
NEXT SYSDATE+366
I have two notes:
1) how to declare the refresh to be done the first new year's day after the day it'll be created , i mean not static date (01/01/2007)
2)some years are leap and some are not , so in order to run every new year's day how should i transform the above..????
3)is there any view which displays the next run of a materialized view..???
the view DBA_MV_REFRESH_TIMES displays the last refresh of mv's...
I use Oracle 10.2.0.1 on XP ...
Thanks , a lot
Simon1).
use the expression that evaluates to next january first.
SQL> select sysdate, add_months(trunc(sysdate, 'yyyy'), 12) from dual ;
SYSDATE ADD_MONTHS(
19-JUN-2006 01-JAN-2007
1 row selected.
SQL>2). for this also use the same expression that will evaluate to the january first of the year after that. -
A bug when refreshing a materialized view?
I am getting "ORA-00603: ORACLE server session terminated by fatal error" upon refresh of a materialized view. I've put together a test case to demonstrate the problem. Is it a bug?
SQL*Plus: Release 10.1.0.3.0 - Production on Fri Jul 29 13:43:45 2005
Copyright (c) 1982, 2004, Oracle. All rights reserved.
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.6.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.6.0 - Production
[email protected]> create table t (
2 id int primary key,
3 t_name varchar2(10),
4 t_date date
5 );
Table created.
[email protected]> create materialized view log on t
2 with rowid (t_name, id, t_date) including new values;
Materialized view log created.
[email protected]> create materialized view t_mv
2 build immediate
3 refresh fast
4 on commit
5 as
6 select t_name, max(id) id, max(t_date) t_date, count(*)
7 from t
8 GROUP BY t_name;
Materialized view created.
[email protected]> create materialized view log on t_mv
2 with rowid (id) including new values;
Materialized view log created.
[email protected]> create table v (
2 id int primary key,
3 t_id int references t(id) on delete cascade,
4 v_name varchar2(10)
5 );
Table created.
[email protected]> create materialized view log on v
2 with rowid (v_name, t_id) including new values;
Materialized view log created.
[email protected]> create materialized view v_mv
2 build immediate
3 refresh fast
4 on commit
5 as
6 select v.rowid rowid1, t_mv.rowid rowid2, v.v_name, v.t_id
7 from v, t_mv
8 where v.t_id = t_mv.id;
Materialized view created.
[email protected]> alter table v_mv
2 add constraint v_mv_uk1 unique
3 (
4 v_name
5 )
6 enable
7 ;
Table altered.
[email protected]> insert into t (id, t_name, t_date) values (1, 'A', sysdate);
1 row created.
[email protected]> insert into t (id, t_name, t_date) values (2, 'B', sysdate);
1 row created.
[email protected]> insert into t (id, t_name, t_date) values (3, 'A', sysdate);
1 row created.
[email protected]> insert into t (id, t_name, t_date) values (4, 'A', sysdate);
1 row created.
[email protected]> insert into t (id, t_name, t_date) values (5, 'B', sysdate);
1 row created.
[email protected]> insert into v (id, t_id, v_name) values (1, 1, 'V_A_1');
1 row created.
[email protected]> insert into v (id, t_id, v_name) values (2, 2, 'V_B_1');
1 row created.
[email protected]> insert into v (id, t_id, v_name) values (3, 3, 'V_A_2');
1 row created.
[email protected]> insert into v (id, t_id, v_name) values (4, 4, 'V_A_3');
1 row created.
[email protected]> insert into v (id, t_id, v_name) values (5, 5, 'V_B_2');
1 row created.
[email protected]> commit;
Commit complete.
[email protected]> insert into t (id, t_name, t_date) values (6, 'A', sysdate);
1 row created.
[email protected]> insert into v (id, t_id, v_name) values (6, 6, 'V_B_2');
1 row created.
[email protected]> commit;
commit
ERROR at line 1:
ORA-12008: error in materialized view refresh path
ORA-00001: unique constraint (FESA.V_MV_UK1) violated
[email protected]> -- ORA-12008 is fine here: that's what was expected
[email protected]> delete from t where id = 5;
1 row deleted.
[email protected]> commit;
ERROR:
ORA-03114: not connected to ORACLE
commit
ERROR at line 1:
ORA-00603: ORACLE server session terminated by fatal errorWhy ORA-00603?
Best regards,
MaciejIt may be a bug, or it may be a result of the dependencies between the materialized views. I don't have a 9.2.0.6 instance that I'm willing to trash to test this, but this is what I get on 9.2.0.1.
If it is a bug they at least changed the behaviour of the bug in 9.2.0.6.
I ran your script up to the first commit then did:
SQL> SELECT * FROM t;
ID T_NAME T_DATE
1 A 29-JUL-05
2 B 29-JUL-05
3 A 29-JUL-05
4 A 29-JUL-05
5 B 29-JUL-05
SQL> SELECT * FROM t_mv;
T_NAME ID T_DATE COUNT(*)
A 4 29-JUL-05 3
B 5 29-JUL-05 2
SQL> SELECT * FROM v;
ID T_ID V_NAME
1 1 V_A_1
2 2 V_B_1
3 3 V_A_2
4 4 V_A_3
5 5 V_B_2
SQL> SELECT * FROM v_mv;
no rows selectedHUH?? But:
SQL> SELECT v.rowid rowid1, t_mv.rowid rowid2, v.v_name, v.t_id
2 FROM v, t_mv
3 WHERE v.t_id = t_mv.id;
ROWID1 ROWID2 V_NAME T_ID
AAAH4QAAIAAAAl1AAD AAAH4MAAIAAAAlFAAA V_A_3 4
AAAH4QAAIAAAAl1AAE AAAH4MAAIAAAAlFAAB V_B_2 5So, I tried:
SQL> EXEC DBMS_MVIEW.REFRESH('V_MV');
PL/SQL procedure successfully completed.
SQL> SELECT * FROM v_mv;
no rows selectedNow, this is confusing, so:
SQL> EXEC DBMS_MVIEW.REFRESH('V_MV', 'COMPLETE');
PL/SQL procedure successfully completed.
SQL> SELECT * FROM v_mv;
ROWID1 ROWID2 V_NAME T_ID
AAAH4dAAIAAAAl1AAD AAAH4ZAAIAAAAlFAAA V_A_3 4
AAAH4dAAIAAAAl1AAE AAAH4ZAAIAAAAlFAAB V_B_2 5So at least I've got something in the MV. Now, to continue your test:
SQL> insert into t (id, t_name, t_date) values (6, 'A', sysdate);
1 row created.
SQL> insert into v (id, t_id, v_name) values (6, 6, 'V_B_2');
1 row created.
SQL> COMMIT;
Commit complete.I also expected the error but no joy, and look at this:
SQL> SELECT * FROM v_mv;
ROWID1 ROWID2 V_NAME T_ID
AAAH4dAAIAAAAl1AAE AAAH4ZAAIAAAAlFAAB V_B_2 5Forcing the refresh on v_mv gets:
SQL> EXEC DBMS_MVIEW.REFRESH('V_MV', 'COMPLETE');
BEGIN DBMS_MVIEW.REFRESH('V_MV', 'COMPLETE'); END;
ERROR at line 1:
ORA-12008: error in materialized view refresh path
ORA-00001: unique constraint (OPS$ORACLE.V_MV_UK1) violatedVery strange! It gets better:
SQL> DELETE FROM t WHERE id = 5;
1 row deleted.
SQL> commit;
Commit complete.
SQL> EXEC DBMS_MVIEW.REFRESH('V_MV', 'COMPLETE');
PL/SQL procedure successfully completed.
SQL> select * from v_mv;
ROWID1 ROWID2 V_NAME T_ID
AAAH4dAAIAAAAl1AAF AAAH4ZAAIAAAAlFAAA V_B_2 6 But:
SQL> SELECT * FROM t_mv;
T_NAME ID T_DATE COUNT(*)
A 6 29-JUL-05 4
B 5 29-JUL-05 2
SQL> SELECT * FROM t;
ID T_NAME T_DATE
1 A 29-JUL-05
2 B 29-JUL-05
3 A 29-JUL-05
4 A 29-JUL-05
6 A 29-JUL-05Obvioulsy, something is not fast refreshing. So lets force it:
SQL> EXEC DBMS_MVIEW.Refresh('T_MV', 'COMPLETE');
PL/SQL procedure successfully completed.
SQL> SELECT * FROM t_mv;
T_NAME ID T_DATE COUNT(*)
A 6 29-JUL-05 4
B 2 29-JUL-05 1
SQL> SELECT * FROM v_mv;
ROWID1 ROWID2 V_NAME T_ID
AAAH4dAAIAAAAl1AAB AAAH4qAAIAAAAlEAAB V_B_1 2
AAAH4dAAIAAAAl1AAF AAAH4qAAIAAAAlEAAA V_B_2 6Which looks right to me.
Then, I blew everything away and did it allagain up to an including the inserts into t, then I inserted into v and commited. Now, both MV's were correct, so I did:
SQL> insert into t (id, t_name, t_date) values (6, 'A', sysdate);
1 row created.
SQL> insert into v (id, t_id, v_name) values (6, 6, 'V_B_2');
1 row created.
SQL> commit;
Commit complete.
SQL> SELECT * FROM t_mv;
T_NAME ID T_DATE COUNT(*)
A 6 29-JUL-05 4
B 5 29-JUL-05 2Still strange, so blow it all away again insert into t commit, insert into v commit, then:
SQL> insert into t (id, t_name, t_date) values (6, 'A', sysdate);
1 row created.
SQL> commit;
Commit complete.
SQL> insert into v (id, t_id, v_name) values (6, 6, 'V_B_2');
1 row created.
SQL> commit;
commit
ERROR at line 1:
ORA-12008: error in materialized view refresh path
ORA-00001: unique constraint (OPS$ORACLE.V_MV_UK1) violatedAt least now it sees the error at commit time for v so lets try the delete:
SQL> delete from t where id = 5;
1 row deleted.
SQL> commit;
Commit complete.
SQL> SELECT * FROM t_mv;
T_NAME ID T_DATE COUNT(*)
A 6 29-JUL-05 4
B 5 29-JUL-05 2
SQL> SELECT * FROM t;
ID T_NAME T_DATE
1 A 29-JUL-05
2 B 29-JUL-05
3 A 29-JUL-05
4 A 29-JUL-05
6 A 29-JUL-05Still not actually refreshing somehow.
I may play with this some more, it seems truly strange to me.
John -
Refresh a materialized view in parallel
Hi,
To improve the refresh performance for a materialized view, I set up it to be refreshed in parallel. The view can be refreshed successfully, however, I did not see the view is refreshed in parallel from session browser, can someone let me know if I miss any steps?
1) In DB A (running 8 CPUs), set up the base table to be parallelized, the base table is called table1
ALTER TABLE A.table1 PARALLEL ( DEGREE Default INSTANCES Default );
2) In Database A, set up the materialized view log
CREATE MATERIALIZED VIEW LOG
ON table1 WITH primary key
INCLUDING NEW VALUES;
3) In Database B (in the same server with Database A), there is an existing table called table1, prebuilt with millions of records in the table. Due to the size of table1, I have to use prebuilt option
Drop MATERIALIZED VIEW table1;
CREATE MATERIALIZED VIEW table1 ON PREBUILT TABLE
REFRESH FAST with primary key
AS
select /*+ PARALLEL(table1, 8) */ *
from table1@A;
4) in Database B, I executed this stored procedure -
EXECUTE DBMS_MVIEW.REFRESH(LIST=>'table1',PARALLELISM=>8, METHOD=>'F');
Thanks in advance!
LizI checked the execution plan when I executed the refresh stored procedure again, Does the plan indicates the parallel execution is working or not?
SELECT STATEMENT REMOTE ALL_ROWSCost: 32,174 Bytes: 775,392 Cardinality: 1,182
13 PX COORDINATOR
12 PX SEND QC (RANDOM) PARALLEL_TO_SERIAL SYS.:TQ10001 :Q1001
11 NESTED LOOPS PARALLEL_COMBINED_WITH_PARENT :Q1001
9 NESTED LOOPS PARALLEL_COMBINED_WITH_PARENT :Q1001Cost: 32,174 Bytes: 775,392 Cardinality: 1,182
6 BUFFER SORT PARALLEL_COMBINED_WITH_CHILD :Q1001
5 PX RECEIVE PARALLEL_COMBINED_WITH_PARENT :Q1001
4 PX SEND ROUND-ROBIN PARALLEL_FROM_SERIAL SYS.:TQ10000 A
3 VIEW APP_USR. Cost: 12,986 Bytes: 6,070,196 Cardinality: 275,918
2 HASH UNIQUE Cost: 12,986 Bytes: 9,105,294 Cardinality: 275,918
1 TABLE ACCESS FULL TABLE A.MLOG$_TABLE1 A Cost: 10,518 Bytes: 9,105,294 Cardinality: 275,918
8 PARTITION RANGE ITERATOR PARALLEL_COMBINED_WITH_PARENT :Q1001Cost: 0 Cardinality: 1
7 INDEX RANGE SCAN INDEX (UNIQUE) PARALLEL_COMBINED_WITH_PARENT A.PK_TABLE1 :Q1001Cost: 0 Cardinality: 1
10 TABLE ACCESS BY LOCAL INDEX ROWID TABLE PARALLEL_COMBINED_WITH_PARENT A.TABLE1 :Q1001Cost: 0 Bytes: 634 Cardinality: 1
Maybe you are looking for
-
Running ssh command from java and then answering password prompt
Hi, I have a situation that has not solved yet. I am running ssh command from unix terminal without any problem, and then i enter password. For example : [oracle@fuata]:/export/home/oracle> ssh -N [email protected] -L 9901:127.0.0.1:9999 Password: It
-
Keynote 08 - problem exporting to Quicktime (no sound or video clip)
Hi Having just spent a long time making and narrating a training slideshow intended for a screencast using Keynote 08 (4.0.3) I choose to export the show as a quicktime movie with the recording timings and recording narrative soundtrack. A screenshot
-
Happy Birthday Oran_gina
Strong hints that today is the day, so happy probably birthday Hope you have a fabulosa day
-
How do you backup IPhone contact list to Computer (XP) PC Computer?
How do you backup IPhone Contact List to PC Computer(XP) ?
-
HT201210 Downgrade to iOS5 from iOS 6.0 with iPhone 3GS
After upgrading to iOS 6.0 5 days ago, I've discovered that lots of files have been missing (photos, contacts, apps...). And trying to restore to previous version iOS 5.1.1 IPSW is not validated by iTunes. I could use my backup on Time Machine, but l