Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Alteração de Definição de TIPO no Oracle 21c


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.