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

Cambio de definición de TIPO en Oracle 21c

SQL*Plus y PL/SQL han estado en desacuerdo durante años:abundan los casos en los que la forma en que se realiza una tarea con SQL*Plus difiere de cómo se completa esa misma tarea o una similar en PL/SQL. Además, hay tipos de datos disponibles en PL/SQL que no estaban disponibles en SQL*Plus. La versión 21c de Oracle proporciona una forma de utilizar algunos de los tipos de datos PL/SQL en las definiciones de tipo SQL*Plus, con la advertencia de que los tipos PL/SQL no serán persistentes. ¿Qué significa esto y cómo se hace para usar este nuevo tesoro de tipos? Investiguemos más a fondo y veamos qué encontramos.

Desde hace un tiempo, la creación de ciertos tipos tanto en PL/SQL como en SQL*Plus implicaba un cambio en la sintaxis:un tipo con dos elementos en PL?SQL es un registro, y esa misma construcción de tipo en SQL*Plus se convierte en un tipo de objeto. Esto es algo a lo que los desarrolladores se han acostumbrado. Sin embargo, si esos tipos deben contener tipos PL/SQL (boolean, pls_integer, binary_integer, etc.), lamentablemente no había una manera fácil en SQL*Plus de satisfacer ese requisito. Hasta el 21c. Veamos un ejemplo de cómo se pueden usar estos tipos en las definiciones de tipos de SQL*Plus. Digamos que, para el argumento, se necesita un tipo con un tipo de datos BOOLEAN en SQL*Plus. Antes de 21c sería necesario hacer MUCHA codificación para imitar el tipo de datos BOOLEAN; con 21c podemos usar BOOLEAN como un tipo, siempre que la base de datos no intente conservar los datos en el disco:

SQL> create or replace
  2  type  EMP_SAL_APPROVAL_FOR_PL as object
  3  (  e_num    number,
  4     e_nme    varchar2(35),
  5     new_sal      number,
  6     mgr_approve boolean
  7  ) not persistable ;
  8  /

Type created.

Dicho objeto se puede pasar a una unidad de programa PL/SQL con el valor BOOLEAN en tiempo de ejecución y Oracle sabe que el valor BOOLEAN no persistirá fuera del contexto actual. Como se indicó anteriormente, esto no está restringido a los valores BOOLEAN; probemos tanto un PLS_INTEGER como un BINARY_INTEGER:

SQL> create or replace
  2  type  EMP_SAL_APPROVAL_FOR_PL as object
  3  (  e_num     number,
  4     e_nme     varchar2(35),
  5     new_sal      number,
  6     mgr_approve boolean,
  6     old_sal   pls_integer,
  7     yrly_sal   binary_integer
  8  ) not persistable ;
  9  /

Type created.

Cualquier tipo de datos que no se pueda persistir en SQL*Plus no se debe a la instrucción "no persistente", aunque se pueden pasar a una unidad PL/SQL en tiempo de ejecución.

Si se pregunta si esto también está disponible para su uso en tablas anidadas y varrays, la respuesta es sí:

SQL> create or replace
  2  type i_array as
  3  varray(40) of (binary_integer)
  4  not persistable;
  5  /

Type created.

Desafortunadamente, esto no permite usar una referencia %TYPE (un atajo conocido y de uso frecuente con codificación PL/SQL para garantizar la coincidencia de tipos entre el código PL/SQL y las tablas utilizadas) en ningún tipo usando la directiva "no persistente":

SQL> create or replace
  2  type  EMP_SAL_APPROVAL_FOR_PL as object
  3  (  e_num     emp.empno%type,
  4     e_nme     varchar2(35),
  5     new_sal      number,
  6     mgr_approve boolean,
  6     old_sal   pls_integer,
  7     yrly_sal   binary_integer
  8  ) not persistable ;
  9  /

Warning: Type created with compilation errors.

SQL>
SQL> show errors
Errors for TYPE EMP_SAL_APPROVAL_FOR_PL

LINE/COL ERROR
-------- -----------------------------------------------------
0/0      PL/SQL: Compilation unit analysis terminated
3/12     PLS-00201: identifier 'EMP.EMPNO' must be declared

Oracle ha dado un paso importante con la directiva "no persistente", que permite a los programadores utilizar tipos de datos PL/SQL en definiciones de tipo SQL*Plus; esto, muy probablemente, tendrá un uso o atractivo limitado sabiendo que los datos representados por dichas construcciones no se almacenarán en la base de datos, pero al pasar valores BOOLEAN, PL:S_INTEGER o BINARY_INTEGER de SQL*Plus a unidades de programa PL/SQL puede elimine cualquier problema de discrepancia de tipos causado por no tener dichos tipos en SQL*Plus. Y este es probablemente el primer paso para expandir la compatibilidad funcional de SQL*Plus con PL/SQL.