sql >> Database teknologi >  >> RDS >> Oracle

Oracle Brugerdefineret type inde i pakkedefinition

Nej, det er ikke tilladt:

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>

Hvis du vil oprette en type, der blot overfører data mellem PL/SQL-procedurer, skal du bruge PL/SQL RECORD-syntaksen:

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 hvis du ønsker en type, som du kan bruge i en SQL-sætning - altså som input til en TABLE() funktion - du skal oprette den som en SQL-type. SQL og PL/SQL bruger to forskellige motorer, og kun SQL-typer er synlige for SQL-motoren.

Mit råd om nødvendigheden af ​​SQL-typer gælder ikke længere for senere versioner af Oracle. I 11gR2 og 12c vil SQL-motoren bestemt understøtte SQL i PL/SQL-pakker, som bruger PL/SQL-tabeller i en TABLE() klausul. Typerne skal erklæres i pakkespecifikationen, og derfor offentlige og synlige for SQL-motoren. Under dækslerne genererer Oracle SQL-typer for hver deklaration. Du kan se disse typer, fordi deres navne starter med SYS_PLSQL_ efterfulgt af numeriske identifikatorer.



  1. Er der en RIGTIG ydelsesforskel mellem INT og VARCHAR primære nøgler?

  2. Mysql unik begrænsning, der tillader en enkelt række for en kombination

  3. Korrekt brug af transaktioner i SQL Server

  4. Dvale> CLOB> Oracle :(