sql >> Base de Datos >  >> RDS >> Oracle

Tipo definido por el usuario de Oracle dentro de la definición del paquete

No, no está permitido:

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 desea crear un tipo que simplemente pase datos entre procedimientos PL/SQL, utilice la sintaxis de 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>

Sin embargo, si desea un tipo que pueda usar en una instrucción SQL, es decir, como entrada a una TABLE() función:deberá crearla como un tipo SQL. SQL y PL/SQL usan dos motores diferentes, y solo los tipos SQL son visibles para el motor SQL.

Mi consejo sobre la necesidad de los tipos de SQL ya no es válido para las versiones posteriores de Oracle. Ciertamente, en 11gR2 y 12c, el motor SQL admitirá SQL en paquetes PL/SQL que usan tablas PL/SQL en un TABLE() cláusula. Los tipos deben declararse en la especificación del paquete, por lo tanto, son públicos y visibles para el motor SQL. Debajo de las cubiertas, Oracle genera tipos de SQL para cada declaración. Puede detectar estos tipos porque sus nombres comienzan con SYS_PLSQL_ seguido de identificadores numéricos.