Nein, es ist nicht erlaubt:
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>
Wenn Sie einen Typ erstellen möchten, der nur Daten zwischen PL/SQL-Prozeduren weitergibt, verwenden Sie die PL/SQL RECORD-Syntax:
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>
Wenn Sie jedoch einen Typ wünschen, den Sie in einer SQL-Anweisung verwenden können – das heißt als Eingabe für eine TABLE()
Funktion - Sie müssen sie als SQL-Typ erstellen. SQL und PL/SQL verwenden zwei verschiedene Engines, und nur SQL-Typen sind für die SQL-Engine sichtbar.
Mein Rat zur Notwendigkeit von SQL-Typen gilt nicht mehr für spätere Versionen von Oracle. Sicherlich wird die SQL-Engine in 11gR2 und 12c SQL in PL/SQL-Paketen unterstützen, die PL/SQL-Tabellen in einer TABLE()
verwenden Klausel. Die Typen müssen in der Paketspezifikation deklariert werden, daher öffentlich und für die SQL-Engine sichtbar. Unter der Decke generiert Oracle SQL-Typen für jede Deklaration. Sie erkennen diese Typen daran, dass ihre Namen mit SYS_PLSQL_
beginnen gefolgt von numerischen Bezeichnern.