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 ;
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.