Nej, det er ikke tilladt:
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>
Hvis du vil oprette en type, der blot overfører data mellem PL/SQL-procedurer, skal du bruge PL/SQL RECORD-syntaksen:
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>
Men hvis du ønsker en type, som du kan bruge i en SQL-sætning - altså som input til en TABLE()
funktion - du skal oprette den som en SQL-type. SQL og PL/SQL bruger to forskellige motorer, og kun SQL-typer er synlige for SQL-motoren.
Mit råd om nødvendigheden af SQL-typer gælder ikke længere for senere versioner af Oracle. I 11gR2 og 12c vil SQL-motoren bestemt understøtte SQL i PL/SQL-pakker, som bruger PL/SQL-tabeller i en TABLE()
klausul. Typerne skal erklæres i pakkespecifikationen, og derfor offentlige og synlige for SQL-motoren. Under dækslerne genererer Oracle SQL-typer for hver deklaration. Du kan se disse typer, fordi deres navne starter med SYS_PLSQL_
efterfulgt af numeriske identifikatorer.