Avatar billede amoelle Nybegynder
29. september 2005 - 14:25 Der 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 ;
Avatar billede pgroen Nybegynder
29. september 2005 - 14:32 #1
For det første:
er der ikke dobbeltkonfekt i

                  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'
Avatar billede pgroen Nybegynder
29. september 2005 - 14:39 #2
Hov, der fik jeg trykket 'send' lidt for hurtigt...

det jeg ville have skrevet, var:

hvis du kører 10g, kan du skrive

SDO_ANYINTERACT(a.geoloc, b.geoloc) = 'TRUE'
  i stedet for
SDO_RELATE(A.GEOLOC, B.GEOLOC, 'MASK=ANYINTERACT QUERYTYPE=WINDOWS')='TRUE'

og i øvrigt hedder det vist QUERYTYPE=WINDOW (uden 'S'), men det har nok ingen betydning.

Hvilken version kører du i øvrigt; det ser ud som der en håndfuld forskellige bugs, der berører det her...
Avatar billede pgroen Nybegynder
29. september 2005 - 14:52 #3
En anden årsag kunne være, hvis tabel- og kolonnenavne i USER_SDO_GEOM_METADATA er i lowercase.
Avatar billede amoelle Nybegynder
29. september 2005 - 14:58 #4
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
Avatar billede amoelle Nybegynder
30. september 2005 - 10:56 #5
Databasen er en  Oracle9i Enterprise Edition Release 9.2.0.6.0
- og du har ret angående S'et i WINDOWS
... fejl kommer stadig.

Vi checker lige navne i USER_SDO_GEOM_METADATA og vender tilbage
Avatar billede amoelle Nybegynder
01. oktober 2005 - 18:54 #6
.... tabel og kolonnenavne i USER_SDO_GEOM_METADATA er alle i uppercase
Avatar billede amoelle Nybegynder
04. oktober 2005 - 08:28 #7
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;
/
Avatar billede amoelle Nybegynder
04. oktober 2005 - 08:33 #8
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;
/
Avatar billede amoelle Nybegynder
10. oktober 2005 - 09:40 #9
Det var en rettighedsfejl :-(
Avatar billede amoelle Nybegynder
10. oktober 2005 - 09:40 #10
Så egentlig skal Oracles Metalink have points, men vi lukker den her.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester