2010-01-11 7 views
8

Simplemente tratando de recuperar el cursor para los identificadores que especifico.Usando un tipo de tabla de Oracle en la cláusula IN - compilación falla

 
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 es un NVARCHAR2 (38)

PL/SQL: ORA-00382: la expresión es de tipo incorrecto
PL/SQL: ORA-22905: no se puede acceder a las filas de un elemento de tabla no anidado

¿Dónde me equivoco?

Respuesta

10

Sólo se puede seleccionar de una colección tipo que se define en la base de datos a través de una sentencia CREATE TYPE, no una matriz asociativa:

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

Gracias .. pero ahora muestra ORA-12714: juego de caracteres nacional no válido especificado en esa línea ... mucho más cerca. –

+1

Es posible que desee publicar otra pregunta sobre eso, ya que es un problema totalmente diferente y no tengo ni idea sobre los problemas del conjunto de caracteres nacionales. –

3

Este es un índice por tabla, que es un PL/Tipo de SQL

Solo puede usar tipos de SQL en el motor SQL de Oracle. O tipos de PL/SQL, que Oracle puede piratear para parecerse a los tipos de SQL.

Puede tener una colección simple similar a una matriz y usarla como resultado. (Sin índice)

type TGuidList is table of NVarchar(38); 

Pero la mejor compatibilidad y estabilidad, se obtiene por la que se declara como un tipo SQL mundial y el uso que dentro de su paquete:

crear tipo TGuidList es la tabla de NVarchar (38) ;

Editar: No necesitarás un NVarChar para un GUID, ¿o sí? Un buen y viejo VarChar debería hacer bien el truco.

+0

Tengo que usar NVarchar2 - es parte del estándar de base de datos arcaico de mi cliente (que es también la razón por la que estoy usando SPs). –

Cuestiones relacionadas