Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle Benutzerdefinierter Typ innerhalb der Paketdefinition

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.