2010-01-11 7 views
8

Po prostu próbuję uzyskać kursor z powrotem dla identyfikatorów, które określam.Użycie typu tabeli Oracle w klauzuli IN - kompilacja kończy się niepowodzeniem

 
CREATE OR REPLACE PACKAGE some_package AS 

    TYPE t_cursor IS REF CURSOR; 
    TYPE t_id_table IS TABLE OF NVARCHAR(38) INDEX BY PLS_INTEGER; 

    PROCEDURE someentity_select(
    p_ids  IN t_id_table, 
    p_results OUT t_cursor); 

END; 

CREATE OR REPLACE PACKAGE BODY some_package AS 

    PROCEDURE someentity_select(
    p_ids  IN t_guid_table, 
    p_results OUT t_cursor) 
    IS 
    BEGIN 

    OPEN p_results FOR 
     SELECT * 
     FROM someschema.someentity 
     WHERE id IN (SELECT column_value FROM TABLE(p_ids)); - fails here 

    END; 

END; 

Uwaga: someschema.someentity.id jest to NVARCHAR2 (38)

PL/SQL: ORA-00382: wyrażenie jest nieprawidłowego typu
PL/SQL: ORA-22905: nie można uzyskać dostęp do wierszy z niezagnieżdżonego elementu tabeli

Gdzie się mylę?

Odpowiedz

10

można wybrać tylko od rodzaju kolekcji, który jest zdefiniowany w bazie danych za pomocą instrukcji CREATE TYPE, nie tablica asocjacyjna:

CREATE TYPE t_id_table IS TABLE OF NVARCHAR(38); 

CREATE OR REPLACE PACKAGE some_package AS 

    PROCEDURE someentity_select(
    p_ids  IN t_guid_table, 
    p_results OUT SYS_REFCURSOR); 

END; 

CREATE OR REPLACE PACKAGE BODY some_package AS 

    PROCEDURE someentity_select(
    p_ids  IN t_guid_table, 
    p_results OUT SYS_REFCURSOR) 
    IS 
    BEGIN 

    OPEN p_results FOR 
     SELECT * 
     FROM someschema.someentity 
     WHERE id IN (SELECT column_value FROM TABLE(p_ids)); 

    END; 

END; 
+0

Dzięki .. ale teraz pokazuje ORA-12714: nieprawidłowy zestaw znaków narodowych określony w tym wierszu .. znacznie bliżej. –

+1

Możesz zadać kolejne pytanie na ten temat, ponieważ jest to zupełnie inny problem i nie mam pojęcia o problemach z zestawem znaków narodowych. –

3

Jest to wskaźnik po stole, który jest PL/Typ SQL.

Można używać tylko typów SQL w silniku SQL Oracle. Lub typy PL/SQL, które Oracle może hakować, aby wyglądać jak typy SQL.

Możesz mieć prosty zbiór podobny do tablicy i używać go jako wynik. (Bez indeksu przez)

type TGuidList is table of NVarchar(38); 

Ale najlepszą kompatybilność i stabilność, można uzyskać poprzez uznanie go jako globalnego typu SQL i używać wewnątrz opakowania:

utworzyć rodzaj TGuidList jest tabela z nvarchar (38) ;

Edytuj: Nie potrzebujesz NVarChar dla GUID, dobrze? Dobry ol VarChar powinien wystarczyć.

+0

Muszę używać NVarchar2 - jest to część archaicznego standardu bazy danych mojego klienta (dlatego też w ogóle używam SP). –