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.