sql >> Database >  >> RDS >> Oracle

Oracle Door de gebruiker gedefinieerd type binnen pakketdefinitie

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.



  1. Een kolom DROP uit een tabel in MySQL met behulp van een kolomnummer

  2. Bind IS NULL of NULL bij gebruik van PHP PDO en MySql

  3. MySQL Fire-And-Forget INSERT / UPDATE / DELETE - mysql_unbuffered_query gebruik aan te raden?

  4. Krijg een lijst met ondersteunde tijdzones in SQL Server (T-SQL)