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.