Nie, to niedozwolone:
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>
Jeśli chcesz utworzyć typ, który po prostu przekazuje dane między procedurami PL/SQL, użyj składni 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>
Jeśli jednak potrzebujesz typu, którego możesz użyć w instrukcji SQL - to jest jako dane wejściowe do TABLE()
funkcja - będziesz musiał ją utworzyć jako typ SQL. SQL i PL/SQL używają dwóch różnych silników i tylko typy SQL są widoczne dla silnika SQL.
Moja rada dotycząca konieczności SQL Types nie jest już prawdziwa dla późniejszych wersji Oracle. Z pewnością w 11gR2 i 12c silnik SQL będzie obsługiwał SQL w pakietach PL/SQL, który używa tabel PL/SQL w TABLE()
klauzula. Typy muszą być zadeklarowane w specyfikacji pakietu, a więc publiczne i widoczne dla silnika SQL. Pod osłonami Oracle generuje typy SQL dla każdej deklaracji. Możesz zauważyć te typy, ponieważ ich nazwy zaczynają się od SYS_PLSQL_
po których następują identyfikatory numeryczne.