Nee, het is niet toegestaan:
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>
Als u een type wilt maken dat alleen gegevens tussen PL/SQL-procedures doorgeeft, gebruik dan de PL/SQL RECORD-syntaxis:
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>
Als u echter een type wilt dat u in een SQL-instructie kunt gebruiken, dat wil zeggen als invoer voor een TABLE()
functie - u moet het als een SQL-type maken. SQL en PL/SQL gebruiken twee verschillende engines en alleen SQL-types zijn zichtbaar voor de SQL-engine.
Mijn advies over de noodzaak van SQL Types geldt niet meer voor latere versies van Oracle. Zeker in 11gR2 en 12c zal de SQL-engine SQL ondersteunen in PL/SQL-pakketten die gebruik maken van PL/SQL-tabellen in een TABLE()
clausule. De typen moeten worden gedeclareerd in de pakketspecificatie, dus openbaar en zichtbaar voor de SQL-engine. Onder de dekens genereert Oracle SQL-types voor elke aangifte. Je kunt deze typen herkennen omdat hun namen beginnen met SYS_PLSQL_
gevolgd door numerieke identificatiecodes.