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.