Oracle
 sql >> база данни >  >> RDS >> Oracle

ТИП Промяна на дефиниция в Oracle 21c

SQL*Plus и PL/SQL са в противоречие от години — има изобилие от случаи, в които как се изпълнява задача с помощта на SQL*Plus се различава от това как същата или подобна задача се изпълнява в PL/SQL. Освен това има налични типове данни в PL/SQL, които не са били налични в SQL*Plus. Oracle версия 21c предоставя начин за използване на някои от типовете данни PL/SQL в дефинициите на тип SQL*Plus, с предупреждението, че типовете PL/SQL няма да бъдат постоянни. Какво означава това и как се използва това новооткрито съкровище от видове? Нека да проучим допълнително и да видим какво ще открием.

От известно време създаването на определени типове както в PL/SQL, така и в SQL*Plus включва промяна в синтаксиса — тип с два елемента в PL?SQL е запис, а същата конструкция на същия тип в SQL*Plus става обектен тип. Това е нещо, което разработчиците са свикнали да правят. Въпреки това, ако тези типове трябва да съдържат PL/SQL типове (boolean, pls_integer, binary_integer и т.н.), за съжаление нямаше лесен начин в SQL*Plus да задоволи това изискване. До 21в. Нека да разгледаме пример за това как такива типове могат да се използват в дефинициите на тип SQL*Plus. Да кажем, че за аргумент е необходим тип с BOOLEAN тип данни в SQL*Plus. Преди 21c би било необходимо да се направи МНОГО кодиране, за да се имитира BOOLEAN тип данни - с 21c можем да използваме BOOLEAN като тип, стига базата данни да не се опитва да запази данните на диска:

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.

Такъв обект може да бъде предаден на програмна единица PL/SQL с BOOLEAN стойност по време на изпълнение и Oracle знае, че BOOLEAN стойността не трябва да съществува извън текущия контекст. Както беше посочено по-рано, това не е ограничено до BOOLEAN стойности; нека опитаме както PLS_INTEGER, така и 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.

Всеки тип данни, който не може да бъде запазен в SQL*Plus, няма да бъде поради инструкцията „не постоянна“, въпреки че те могат да бъдат предадени на PL/SQL единица по време на изпълнение.

Ако се чудите дали това е достъпно и за използване във вложени таблици и променливи, отговорът е да:

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

Type created.

За съжаление това не позволява използването на препратка %TYPE (добре познат и често използван пряк път с PL/SQL кодиране, за да се осигури съвпадение на типа между PL/SQL кода и използваните таблици) във всеки тип, използвайки директивата „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

Oracle направи значителна стъпка с директивата „not persistable“, позволявайки на програмистите да използват типове данни PL/SQL в дефинициите на тип SQL*Plus; това най-вероятно ще има ограничена употреба или привлекателност, като се знае, че данните, представени от такива конструкции, няма да се съхраняват в базата данни, но при предаване на стойности BOOLEAN, PL:S_INTEGER или BINARY_INTEGER от SQL*Plus към програмни единици PL/SQL може елиминирайте всякакви проблеми с несъответствието на типовете, причинени от липсата на такива типове в SQL*Plus. И това вероятно е първата стъпка в разширяването на функционалната съвместимост на SQL*Plus с PL/SQL.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да извлечете данни от две колони във формат A,B в Oracle

  2. Шифроване на парола в R - за свързване към Oracle DB с помощта на RODBC

  3. Как да използвам тип таблица в оператор SELECT FROM?

  4. Как да извика процедура без параметър out като тип таблица от Java клас

  5. Oracle Database 21c