SQL*Plus e PL/SQL estão em desacordo há anos - há muitos casos em que a forma como uma tarefa é executada usando SQL*Plus difere de como essa mesma tarefa ou semelhante é concluída em PL/SQL. Além disso, existem tipos de dados disponíveis em PL/SQL que não estavam disponíveis no SQL*Plus. O Oracle versão 21c fornece uma maneira de usar alguns dos tipos de dados PL/SQL nas definições de tipo SQL*Plus, com a ressalva de que os tipos PL/SQL não serão persistentes. O que isso significa e como usar esse tesouro de tipos recém-descoberto? Vamos investigar mais e ver o que encontramos.
Por um tempo, criar certos tipos em PL/SQL e SQL*Plus envolveu uma mudança na sintaxe — um tipo com dois elementos em PL?SQL é um registro, e essa mesma construção de tipo no SQL*Plus se torna um tipo de objeto. Isso é algo que os desenvolvedores se acostumaram a fazer. No entanto, se esses tipos precisam conter tipos PL/SQL (boolean, pls_integer, binary_integer, etc.), infelizmente não havia uma maneira fácil no SQL*Plus de satisfazer esse requisito. Até às 21h. Vejamos um exemplo de como esses tipos podem ser usados nas definições de tipo SQL*Plus. Digamos que, para argumento, seja necessário um tipo com um tipo de dados BOOLEAN no SQL*Plus. Antes do 21c seria necessário fazer MUITA codificação para imitar o tipo de dados BOOLEAN — com o 21c podemos usar BOOLEAN como tipo, desde que o banco de dados não tente persistir os dados no 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.
Tal objeto pode ser passado para uma unidade de programa PL/SQL com o valor BOOLEAN em tempo de execução e o Oracle sabe que o valor BOOLEAN não deve persistir fora do contexto atual. Como dito anteriormente, isso não se restringe a valores BOOLEAN; vamos tentar um PLS_INTEGER e um 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.
Qualquer tipo de dado que não possa ser persistido no SQL*Plus não será devido à instrução “not persistable”, embora possa ser passado para uma unidade PL/SQL em tempo de execução.
Se você está se perguntando se isso também está disponível para uso em tabelas aninhadas e varrays, a resposta é sim:
SQL> create or replace 2 type i_array as 3 varray(40) of (binary_integer) 4 not persistable; 5 / Type created.
Infelizmente, isso não permite usar uma referência %TYPE (um atalho bem conhecido e frequentemente usado com codificação PL/SQL para garantir a correspondência de tipo entre o código PL/SQL e as tabelas usadas) em qualquer tipo usando a diretiva “not persistable”:
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
A Oracle deu um passo significativo com a diretiva “not persistable”, permitindo que os programadores utilizem tipos de dados PL/SQL nas definições de tipo SQL*Plus; isso provavelmente terá uso ou apelo limitado, sabendo que os dados representados por tais construções não serão armazenados no banco de dados, mas ao passar valores BOOLEAN, PL:S_INTEGER ou BINARY_INTEGER de SQL*Plus para unidades de programa PL/SQL, ele pode elimine quaisquer problemas de incompatibilidade de tipo causados por não ter esses tipos no SQL*Plus. E este é provavelmente o primeiro passo para expandir a compatibilidade funcional do SQL*Plus com PL/SQL.