Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Tipo definido pelo usuário Oracle dentro da definição do pacote


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.