2010-01-11 2 views
8

semplicemente cercando di ottenere un cursore per gli ID specificata.L'utilizzo di un tipo di Oracle Tavolo in IN-clausola - compilazione fallisce

 
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; 

Nota: someschema.someentity.id è un NVARCHAR2 (38)

PL/SQL: ORA-00382: l'espressione è di tipo sbagliato
PL/SQL: ORA-22905: non può accedere alle righe da un elemento tavolo non annidata

Dove sto andando male?

risposta

10

È possibile selezionare solo da un tipo di raccolta che viene definita nel database tramite un'istruzione CREATE TYPE, non un array associativo:

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

Grazie .. ma ora si vede ORA-12714: set di caratteri nazionali non valido specificato su quella linea .. molto più vicino però. –

+1

Puoi postare un'altra domanda al riguardo, poiché si tratta di un problema completamente diverso e non ho idea dei problemi relativi ai set di caratteri nazionali. –

3

Questo è un indice-by tavolo, che è un PL/Tipo SQL.

È possibile utilizzare solo tipi SQL nel motore SQL di Oracle. O tipi PL/SQL, che Oracle può incidere per assomigliare a tipi SQL.

Si può avere una semplice raccolta di matrice simile e usarlo come un risultato. (Senza indice)

type TGuidList is table of NVarchar(38); 

Ma la migliore compatibilità e la stabilità, si ottiene dichiarando come un tipo SQL globale e l'uso che all'interno del pacchetto:

creare tipo TGuidList è tabella di nvarchar (38) ;

Edit: Non avrete bisogno di un NVARCHAR per un GUID, vero? Un buon vecchio VarChar dovrebbe fare il trucco bene.

+0

Devo usare NVarchar2 - fa parte dello standard di database arcaico del mio cliente (che è anche il motivo per cui sto usando SPs). –