Oracle
 sql >> Database >  >> RDS >> Oracle

Tipo definito dall'utente Oracle all'interno della definizione del pacchetto

No, non è consentito:

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 vuoi creare un tipo che sta solo passando dati tra procedure PL/SQL, usa la sintassi RECORD PL/SQL:

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>

Tuttavia, se desideri un tipo che puoi utilizzare in un'istruzione SQL, ovvero come input per un TABLE() funzione:dovrai crearlo come tipo SQL. SQL e PL/SQL utilizzano due motori diversi e solo i tipi SQL sono visibili al motore SQL.

Il mio consiglio sulla necessità dei tipi SQL non è più vero per le versioni successive di Oracle. Certamente in 11gR2 e 12c il motore SQL supporterà SQL nei pacchetti PL/SQL che utilizza tabelle PL/SQL in un TABLE() clausola. I tipi devono essere dichiarati nelle specifiche del pacchetto, quindi pubblici e visibili al motore SQL. Sotto le coperte Oracle genera tipi SQL per ogni dichiarazione. Puoi individuare questi tipi perché i loro nomi iniziano con SYS_PLSQL_ seguito da identificatori numerici.