Oracle
 sql >> Base de données >  >> RDS >> Oracle

Modification de la définition de TYPE dans Oracle 21c

SQL*Plus et PL/SQL sont en désaccord depuis des années - les cas abondent où la façon dont une tâche est exécutée à l'aide de SQL*Plus diffère de la façon dont cette même tâche ou une tâche similaire est effectuée en PL/SQL. De plus, certains types de données disponibles en PL/SQL n'étaient pas disponibles dans SQL*Plus. Oracle version 21c permet d'utiliser certains des types de données PL/SQL dans les définitions de type SQL*Plus, avec la mise en garde que les types PL/SQL ne seront pas persistants. Qu'est-ce que cela signifie et comment s'y prendre pour utiliser ce nouveau trésor de types ? Allons plus loin et voyons ce que nous trouvons.

Pendant un certain temps, la création de certains types à la fois en PL/SQL et en SQL*Plus impliquait un changement de syntaxe — un type avec deux éléments en PL-SQL est un enregistrement, et cette même construction de type en SQL*Plus devient un type d'objet. C'est quelque chose que les développeurs ont pris l'habitude de faire. Cependant, si ces types doivent contenir des types PL/SQL (boolean, pls_integer, binary_integer, etc.), il n'y avait malheureusement pas de moyen simple dans SQL*Plus de satisfaire cette exigence. Jusqu'à 21c. Examinons un exemple de la manière dont ces types peuvent être utilisés dans les définitions de type SQL*Plus. Disons, pour l'argument, un type est nécessaire avec un type de données BOOLEAN dans SQL * Plus. Avant 21c, il serait nécessaire de faire BEAUCOUP de codage pour imiter le type de données BOOLEAN - avec 21c, nous pouvons utiliser BOOLEAN comme type, tant que la base de données n'essaie pas de conserver les données sur le disque :

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.

Un tel objet peut être transmis à une unité de programme PL/SQL avec la valeur BOOLEAN au moment de l'exécution et Oracle sait que la valeur BOOLEAN ne doit pas persister en dehors du contexte actuel. Comme indiqué précédemment, cela ne se limite pas aux valeurs booléennes ; essayons à la fois un PLS_INTEGER et 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.

Tout type de données qui ne peut pas être persistant dans SQL*Plus ne le sera pas à cause de l'instruction "non persistant", bien qu'il puisse être transmis à une unité PL/SQL au moment de l'exécution.

Si vous vous demandez si cela est également disponible pour une utilisation dans les tableaux imbriqués et les varrays, la réponse est oui :

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

Type created.

Malheureusement, cela ne permet pas d'utiliser une référence %TYPE (un raccourci bien connu et souvent utilisé avec le codage PL/SQL pour assurer la correspondance de type entre le code PL/SQL et les tables utilisées) dans n'importe quel type en utilisant la directive "non 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

Oracle a franchi une étape importante avec la directive "non persistable", permettant aux programmeurs d'utiliser les types de données PL/SQL dans les définitions de type SQL*Plus ; cela aura très probablement une utilisation ou un attrait limité sachant que les données représentées par de telles constructions ne seront pas stockées dans la base de données, mais lors du passage des valeurs BOOLEAN, PL:S_INTEGER ou BINARY_INTEGER de SQL * Plus aux unités de programme PL / SQL, il peut éliminer tous les problèmes d'incompatibilité de type causés par l'absence de tels types dans SQL*Plus. Et c'est probablement la première étape de l'extension de la compatibilité fonctionnelle de SQL*Plus avec PL/SQL.