2011-11-28 17 views
9

¿es posible tener un tipo definido por el usuario dentro de la definición del paquete de Oracle? Cuando intento siguienteTipo definido por el usuario de Oracle dentro de la definición del paquete

CREATE OR REPLACE PACKAGE AF_CONTRACT AS -- spec 
    -- PROCEDURE my_rpcedure (emp_id NUMBER); 
    TYPE DTO_GRID AS OBJECT 
    (
    ROWKEY NVARCHAR2(200), 
    COLUMNKEY NVARCHAR2(200), 
    CELLVALUE NVARCHAR2(200), 
    OLDVALUE NVARCHAR2(200), 
    TAG  NVARCHAR2(200) 
    ); 
END AF_CONTRACT; 
/
CREATE OR REPLACE PACKAGE BODY AF_CONTRACT AS -- body 

-- PROCEDURE my_procedure (emp_id NUMBER) IS 
-- BEGIN 
--  
-- END my_procedure; 

END AF_CONTRACT; 

siempre consigo un error

Error: PLS-00540: object not supported in this context. 

en la definición de tipo.

Respuesta

14

No, no está permitido:

SQL> CREATE OR REPLACE PACKAGE AF_CONTRACT AS -- spec 
    -- PROCEDURE my_rpcedure (emp_id NUMBER); 
    TYPE DTO_GRID AS OBJECT 
    (
    ROWKEY NVARCHAR2(200), 
    COLUMNKEY NVARCHAR2(200), 
    CELLVALUE NVARCHAR2(200), 
    OLDVALUE NVARCHAR2(200), 
    TAG  NVARCHAR2(200) 
    ); 
END AF_CONTRACT; 
/
    2 3 4 5 6 7 8 9 10 11 12 

Warning: Package created with compilation errors. 

SQL> SQL> sho err 
Errors for PACKAGE AF_CONTRACT: 

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
3/4  PLS-00540: object not supported in this context. 
SQL> 

Si desea crear un tipo que se acaba de pasar datos entre procedimientos PL/SQL a continuación, utilizar el PL/SQL la sintaxis de registro:

SQL> CREATE OR REPLACE PACKAGE AF_CONTRACT AS -- spec 
    -- PROCEDURE my_rpcedure (emp_id NUMBER); 
    TYPE DTO_GRID IS RECORD 
    (
    ROWKEY NVARCHAR2(200), 
    COLUMNKEY NVARCHAR2(200), 
    CELLVALUE NVARCHAR2(200), 
    OLDVALUE NVARCHAR2(200), 
    TAG  NVARCHAR2(200) 
    ); 
END AF_CONTRACT; 
/
    2 3 4 5 6 7 8 9 10 11 12 
Package created. 

SQL> 

Sin embargo, si quieres un tipo que se puede utilizar en una instrucción SQL - es decir, como la entrada a un TABLE() función: tendrá que crearlo como un tipo de SQL. SQL y PL/SQL usan dos motores diferentes, y solo los tipos SQL son visibles para el motor SQL.


Mi consejo sobre la necesidad de tipos de SQL ya no es cierto para las versiones posteriores de Oracle. Ciertamente, en 11gR2 y 12c, el motor SQL admitirá SQL en paquetes PL/SQL que usa tablas PL/SQL en una cláusula TABLE(). Los tipos deben declararse en la especificación del paquete, por lo tanto, son públicos y visibles para el motor SQL. Bajo las cubiertas Oracle genera tipos de SQL para cada declaración. Puede detectar estos tipos porque sus nombres comienzan en SYS_PLSQL_ seguidos por identificadores numéricos.

Cuestiones relacionadas