Nej, det är inte tillåtet:
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>
Om du vill skapa en typ som bara skickar data mellan PL/SQL-procedurer använder du syntaxen 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>
Men om du vill ha en typ som du kan använda i en SQL-sats - det vill säga som indata till en TABLE()
funktion - du måste skapa den som en SQL-typ. SQL och PL/SQL använder två olika motorer, och endast SQL-typer är synliga för SQL-motorn.
Mitt råd om nödvändigheten av SQL-typer är inte längre sant för senare versioner av Oracle. Visst i 11gR2 och 12c kommer SQL-motorn att stödja SQL i PL/SQL-paket som använder PL/SQL-tabeller i en TABLE()
klausul. Typerna måste deklareras i paketspecifikationen, därför offentliga och synliga för SQL-motorn. Under täcket genererar Oracle SQL-typer för varje deklaration. Du kan se dessa typer eftersom deras namn börjar med SYS_PLSQL_
följt av numeriska identifierare.