Não, não é 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>
Se você deseja criar um tipo que está apenas passando dados entre procedimentos PL/SQL, use a sintaxe PL/SQL RECORD:
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>
No entanto, se você quiser um tipo que possa ser usado em uma instrução SQL - ou seja, como entrada para um
TABLE()
function - você precisará criá-lo como um tipo SQL. SQL e PL/SQL usam dois mecanismos diferentes e apenas os tipos SQL são visíveis para o mecanismo SQL. Meu conselho sobre a necessidade de SQL Types não é mais verdadeiro para versões posteriores do Oracle. Certamente em 11gR2 e 12c o mecanismo SQL suportará SQL em pacotes PL/SQL que usam tabelas PL/SQL em um
TABLE()
cláusula. Os tipos devem ser declarados na especificação do pacote, portanto, públicos e visíveis para o mecanismo SQL. Nos bastidores, a Oracle gera tipos SQL para cada declaração. Você pode identificar esses tipos porque seus nomes começam com SYS_PLSQL_
seguido por identificadores numéricos.