Oracle
 sql >> Base de données >  >> RDS >> Oracle

Type défini par l'utilisateur Oracle dans la définition de package

Non, ce n'est pas autorisé :

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>

Si vous souhaitez créer un type qui ne fait que transmettre des données entre des procédures PL/SQL, utilisez la syntaxe PL/SQL RECORD :

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>

Cependant, si vous voulez un type que vous pouvez utiliser dans une instruction SQL - c'est-à-dire comme entrée d'un TABLE() fonction - vous devrez la créer en tant que type SQL. SQL et PL/SQL utilisent deux moteurs différents et seuls les types SQL sont visibles par le moteur SQL.

Mon conseil sur la nécessité des types SQL n'est plus vrai pour les versions ultérieures d'Oracle. Certes, dans 11gR2 et 12c, le moteur SQL prendra en charge SQL dans les packages PL/SQL qui utilisent des tables PL/SQL dans un TABLE() clause. Les types doivent être déclarés dans la spécification du package, donc publics et visibles pour le moteur SQL. Sous les couvertures, Oracle génère des types SQL pour chaque déclaration. Vous pouvez repérer ces types car leurs noms commencent par SYS_PLSQL_ suivi d'identificateurs numériques.