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.