Ne, není to povoleno:
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>
Pokud chcete vytvořit typ, který pouze předává data mezi procedurami PL/SQL, použijte syntaxi 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>
Pokud však chcete typ, který můžete použít v příkazu SQL – tedy jako vstup do TABLE()
funkce - budete ji muset vytvořit jako typ SQL. SQL a PL/SQL používají dva různé motory a pro stroj SQL jsou viditelné pouze typy SQL.
Moje rada o nezbytnosti SQL Types již neplatí pro pozdější verze Oracle. Určitě v 11gR2 a 12c bude SQL engine podporovat SQL v PL/SQL balíčcích, které používají PL/SQL tabulky v TABLE()
doložka. Typy musí být deklarovány ve specifikaci balíčku, tedy veřejné a viditelné pro SQL engine. Pod kryty Oracle generuje typy SQL pro každou deklaraci. Tyto typy můžete najít, protože jejich názvy začínají SYS_PLSQL_
následují číselné identifikátory.