29. september 2005 - 14:25Der er
9 kommentarer og 1 løsning
cursor med spatial sql i procedure - ora 13268 fejl
Vi har en procedure, der erklærer en cursor, hvor whereclausen indeholder spatial sql. Når vi afvikler den fra sql+ går det fint, - men når vi afvikler den inde i proceduren fejler den med: ORA-13268: fejl ved opnåelse af dimensioner fra USER_SDO_GEOM_METADATA
HVAD kan mon være galt ?? Vi har prøvet at åbne cursoren både med den ene og den anden metode:
open info(p_info_id); fetch info into c_kunde_pk; WHILE info%FOUND LOOP begin dbms_output.put_line('c_kunde_id: '||c_kunde_pk); fetch info into c_kunde_pk; end LOOP; close info;
og
FOR kunde IN info(p_info_id) LOOP dbms_output.put_line('c_kunde: '||kunde.c_kunde_pk); END LOOP;
BEGGE metoder virker fra sql+, men ingen af dem virker inden i en procedure.
Skal det istedet være inde i en pakke ???
på forhånd tak
mvh Anne
**************** CREATE OR REPLACE PROCEDURE geotest ( p_info_id number, p_spec_id number, p_type number, p_polygon MDSYS.SDO_GEOMETRY) IS c_kunde_id number; cursor info (l_info_id in number) is SELECT B.L_KUNDE_PK c_kunde_pk FROM SCH_V_VAND.V_Z_ZONEGRAENSE_AKV_V A,SCH_INFO.KUNDE_T B WHERE A.LBNR IN (SELECT A.LBNR FROM SCH_V_VAND.V_Z_ZONEGRAENSE_AKV_V A, SCH_INFO.INFO_T B WHERE B.L_INFO_PK = l_info_id AND SDO_RELATE(A.GEOLOC, B.GEOLOC, 'MASK=ANYINTERACT QUERYTYPE=WINDOWS')='TRUE') AND SDO_RELATE(A.GEOLOC, B.GEOLOC, 'MASK=ANYINTERACT QUERYTYPE=WINDOWS')='TRUE' AND B.L_KUNDE_PK in ( SELECT KS.K_KUNDE_FK FROM KUNDE_SYSTEM_T KS WHERE KS.K_FORSYNING_SYSTEM_FK = P_TYPE); begin FOR kunde IN info(p_info_id) LOOP dbms_output.put_line('c_kunde: '||kunde.c_kunde_pk); END LOOP; dbms_output.put_line('SLUT'); exception WHEN OTHERS THEN dbms_output.put_line('OTHERS fejl, '||sqlerrm); end geotest ;
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
AND SDO_RELATE(A.GEOLOC, B.GEOLOC, 'MASK=ANYINTERACT QUERYTYPE=WINDOWS')='TRUE') AND SDO_RELATE(A.GEOLOC, B.GEOLOC, 'MASK=ANYINTERACT QUERYTYPE=WINDOWS')='TRUE'
and SDO_FILTER(f.fiume.lunghezza,p.parco.area_parco,'querytype=WINDOW')='TRUE' and SDO_ANYINTERACT(f.fiume.lunghezza,p.parco.area_parco)='TRUE'
tak for godt input, jeg sidder ikke på databasen lige nu, - så jeg har sendt dine uddybende spørgsmål videre til een der gør. Vi vender tilbage :-) /Anne
Vi forhøjer lige indsatsen :-) Fejlen viser sig også, hvis man installerer pakken (og derefter kalder den) fra et lille PL/SQL script á la:
CREATE OR REPLACE PACKAGE GEO AS PROCEDURE FIND(p_info_id number, p_spec_id number, p_type number, p_polygon MDSYS.SDO_GEOMETRY) ; END GEO; / CREATE OR REPLACE PACKAGE BODY GEO IS PROCEDURE FIND ( p_info_id number, p_spec_id number, p_type number, p_polygon MDSYS.SDO_GEOMETRY) is
cursor info_kunder12 (l_info_id in number) is -- alle kunder, hvis geoloc vedrører INFO_T's geoloc SELECT B.L_KUNDE_PK c_kunde FROM SCH_V_VAND.V_Z_ZONEGRAENSE_AKV_V A, SCH_INFO.KUNDE_T B WHERE A.LBNR IN (SELECT A.LBNR FROM SCH_V_VAND.V_Z_ZONEGRAENSE_AKV_V A, SCH_INFO.INFO_T B WHERE B.L_INFO_PK = l_info_id AND SDO_RELATE(A.GEOLOC, B.GEOLOC,'MASK=ANYINTERACT QUERYTYPE=WINDOWS')='TRUE') AND SDO_RELATE(A.GEOLOC, B.GEOLOC,'MASK=ANYINTERACT QUERYTYPE=WINDOWS')='TRUE' AND B.L_KUNDE_PK in (select KS.K_KUNDE_FK from KUNDE_SYSTEM_T KS WHERE KS.K_FORSYNING_SYSTEM_FK = P_TYPE); begin dbms_output.put_line('FIND_KUNDER,START'); if p_type in (1, 2) then begin FOR kunder IN info_kunder12(p_info_id) LOOP dbms_output.put_line('FIND_KUNDER 12 c_kunde: '||kunder.c_kunde); end LOOP; end; end if; exception WHEN OTHERS THEN dbms_output.put_line('FIND_KUNDER 3, '||sqlerrm); end FIND; END; /
Fra sql+ som SCH_INFO fyres nu følgende et lille PL/SQL script: set serverout on size 100000 set pages 999 BEGIN geo.find(1,1,1,null); EXCEPTION when others then dbms_output.put_line('fejl: '||sqlerrm); END;
CREATE OR REPLACE PACKAGE GEO AS PROCEDURE FIND(p_info_id number, p_spec_id number, p_type number, p_polygon MDSYS.SDO_GEOMETRY) ; END GEO; / CREATE OR REPLACE PACKAGE BODY GEO IS PROCEDURE FIND ( p_info_id number, p_spec_id number, p_type number, p_polygon MDSYS.SDO_GEOMETRY) is
cursor info_kunder12 (l_info_id in number) is -- alle kunder, hvis geoloc vedrører INFO_T's geoloc SELECT B.L_KUNDE_PK c_kunde FROM SCH_V_VAND.V_Z_ZONEGRAENSE_AKV_V A, SCH_INFO.KUNDE_T B WHERE A.LBNR IN (SELECT A.LBNR FROM SCH_V_VAND.V_Z_ZONEGRAENSE_AKV_V A, SCH_INFO.INFO_T B WHERE B.L_INFO_PK = l_info_id AND SDO_RELATE(A.GEOLOC, B.GEOLOC,'MASK=ANYINTERACT QUERYTYPE=WINDOWS')='TRUE') AND SDO_RELATE(A.GEOLOC, B.GEOLOC,'MASK=ANYINTERACT QUERYTYPE=WINDOWS')='TRUE' AND B.L_KUNDE_PK in (select KS.K_KUNDE_FK from KUNDE_SYSTEM_T KS WHERE KS.K_FORSYNING_SYSTEM_FK = P_TYPE); begin dbms_output.put_line('FIND_KUNDER,START'); if p_type in (1, 2) then begin FOR kunder IN info_kunder12(p_info_id) LOOP dbms_output.put_line('FIND_KUNDER 12 c_kunde: '||kunder.c_kunde); end LOOP; end; end if; exception WHEN OTHERS THEN dbms_output.put_line('FIND_KUNDER 3, '||sqlerrm); end FIND; END; /
Fra sql+ som SCH_INFO fyres nu følgende et lille PL/SQL script: set serverout on size 100000 set pages 999 BEGIN geo.find(1,1,1,null); EXCEPTION when others then dbms_output.put_line('fejl: '||sqlerrm); END;
CREATE OR REPLACE PACKAGE GEO AS PROCEDURE FIND(p_info_id number, p_spec_id number, p_type number, p_polygon MDSYS.SDO_GEOMETRY) ; END GEO; / CREATE OR REPLACE PACKAGE BODY GEO IS PROCEDURE FIND ( p_info_id number, p_spec_id number, p_type number, p_polygon MDSYS.SDO_GEOMETRY) is
cursor info_kunder12 (l_info_id in number) is -- alle kunder, hvis geoloc vedrører INFO_T's geoloc SELECT B.L_KUNDE_PK c_kunde FROM SCH_V_VAND.V_Z_ZONEGRAENSE_AKV_V A, SCH_INFO.KUNDE_T B WHERE A.LBNR IN (SELECT A.LBNR FROM SCH_V_VAND.V_Z_ZONEGRAENSE_AKV_V A, SCH_INFO.INFO_T B WHERE B.L_INFO_PK = l_info_id AND SDO_RELATE(A.GEOLOC, B.GEOLOC,'MASK=ANYINTERACT QUERYTYPE=WINDOWS')='TRUE') AND SDO_RELATE(A.GEOLOC, B.GEOLOC,'MASK=ANYINTERACT QUERYTYPE=WINDOWS')='TRUE' AND B.L_KUNDE_PK in (select KS.K_KUNDE_FK from KUNDE_SYSTEM_T KS WHERE KS.K_FORSYNING_SYSTEM_FK = P_TYPE); begin dbms_output.put_line('FIND_KUNDER,START'); if p_type in (1, 2) then begin FOR kunder IN info_kunder12(p_info_id) LOOP dbms_output.put_line('FIND_KUNDER 12 c_kunde: '||kunder.c_kunde); end LOOP; end; end if; exception WHEN OTHERS THEN dbms_output.put_line('FIND_KUNDER 3, '||sqlerrm); end FIND; END; /
Fra sql+ som SCH_INFO fyres nu følgende et lille PL/SQL script: set serverout on size 100000 set pages 999 BEGIN geo.find(1,1,1,null); EXCEPTION when others then dbms_output.put_line('fejl: '||sqlerrm); END;
der giver flg fejl: fejl: ORA-13268: fejl ved opnåelse af dimensioner fra USER_SDO_GEOM_METADATA PL/SQL-procedure er udført.
**************
Fejlen kommer ikke, hvis man afvikler følgende fra PL/SQL: (der er hardkodet 2 værdier)
DECLARE cursor info_kunder12 (l_info_id in number) is SELECT B.L_KUNDE_PK c_kunde FROM SCH_V_VAND.V_Z_ZONEGRAENSE_AKV_V A, SCH_INFO.KUNDE_T B WHERE A.LBNR IN (SELECT A.LBNR FROM SCH_V_VAND.V_Z_ZONEGRAENSE_AKV_V A, SCH_INFO.INFO_T B WHERE B.L_INFO_PK = l_info_id AND SDO_RELATE(A.GEOLOC, B.GEOLOC,'MASK=ANYINTERACT QUERYTYPE=WINDOWS')='TRUE') AND SDO_RELATE(A.GEOLOC, B.GEOLOC,'MASK=ANYINTERACT QUERYTYPE=WINDOWS')='TRUE' AND B.L_KUNDE_PK in (select KS.K_KUNDE_FK from KUNDE_SYSTEM_T KS WHERE KS.K_FORSYNING_SYSTEM_FK = 2); BEGIN FOR kunder IN info_kunder12(1183) LOOP dbms_output.put_line('c_kunde: '||kunder.c_kunde); end LOOP; EXCEPTION WHEN OTHERS THEN dbms_output.put_line('fejl: '||sqlerrm); END; /
UPS ! moralen er: brug ALTID en editor, hvis du har et langt indlæg.....
HER er spørgsmålet:
************************' Fejlen viser sig også, hvis man installerer pakken (og derefter kalder den) fra et lille PL/SQL script á la:
CREATE OR REPLACE PACKAGE GEO AS PROCEDURE FIND(p_info_id number, p_spec_id number, p_type number, p_polygon MDSYS.SDO_GEOMETRY) ; END GEO; / CREATE OR REPLACE PACKAGE BODY GEO IS PROCEDURE FIND ( p_info_id number, p_spec_id number, p_type number, p_polygon MDSYS.SDO_GEOMETRY) is
cursor info_kunder12 (l_info_id in number) is -- alle kunder, hvis geoloc vedrører INFO_T's geoloc SELECT B.L_KUNDE_PK c_kunde FROM SCH_V_VAND.V_Z_ZONEGRAENSE_AKV_V A, SCH_INFO.KUNDE_T B WHERE A.LBNR IN (SELECT A.LBNR FROM SCH_V_VAND.V_Z_ZONEGRAENSE_AKV_V A, SCH_INFO.INFO_T B WHERE B.L_INFO_PK = l_info_id AND SDO_RELATE(A.GEOLOC, B.GEOLOC,'MASK=ANYINTERACT QUERYTYPE=WINDOWS')='TRUE') AND SDO_RELATE(A.GEOLOC, B.GEOLOC,'MASK=ANYINTERACT QUERYTYPE=WINDOWS')='TRUE' AND B.L_KUNDE_PK in (select KS.K_KUNDE_FK from KUNDE_SYSTEM_T KS WHERE KS.K_FORSYNING_SYSTEM_FK = P_TYPE); begin dbms_output.put_line('FIND_KUNDER,START'); if p_type in (1, 2) then begin FOR kunder IN info_kunder12(p_info_id) LOOP dbms_output.put_line('FIND_KUNDER 12 c_kunde: '||kunder.c_kunde); end LOOP; end; end if; exception WHEN OTHERS THEN dbms_output.put_line('FIND_KUNDER 3, '||sqlerrm); end FIND; END; /
Fra sql+ som SCH_INFO fyres nu følgende et lille PL/SQL script: set serverout on size 100000 set pages 999 BEGIN geo.find(1,1,1,null); EXCEPTION when others then dbms_output.put_line('fejl: '||sqlerrm); END;
************** Fejlen kommer ikke ***********************
Fejlen kommer ikke, hvis man afvikler følgende fra PL/SQL: (der er hardkodet 2 værdier)
DECLARE cursor info_kunder12 (l_info_id in number) is SELECT B.L_KUNDE_PK c_kunde FROM SCH_V_VAND.V_Z_ZONEGRAENSE_AKV_V A, SCH_INFO.KUNDE_T B WHERE A.LBNR IN (SELECT A.LBNR FROM SCH_V_VAND.V_Z_ZONEGRAENSE_AKV_V A, SCH_INFO.INFO_T B WHERE B.L_INFO_PK = l_info_id AND SDO_RELATE(A.GEOLOC, B.GEOLOC,'MASK=ANYINTERACT QUERYTYPE=WINDOWS')='TRUE') AND SDO_RELATE(A.GEOLOC, B.GEOLOC,'MASK=ANYINTERACT QUERYTYPE=WINDOWS')='TRUE' AND B.L_KUNDE_PK in (select KS.K_KUNDE_FK from KUNDE_SYSTEM_T KS WHERE KS.K_FORSYNING_SYSTEM_FK = 2); BEGIN FOR kunder IN info_kunder12(1183) LOOP dbms_output.put_line('c_kunde: '||kunder.c_kunde); end LOOP; EXCEPTION WHEN OTHERS THEN dbms_output.put_line('fejl: '||sqlerrm); END; /
Så egentlig skal Oracles Metalink have points, men vi lukker den her.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.