SQL*Plus i PL/SQL od lat są ze sobą sprzeczne — mnóstwo jest przypadków, w których sposób wykonania zadania przy użyciu SQL*Plus różni się od tego, jak to samo lub podobne zadanie jest wykonywane w PL/SQL. Dodatkowo istnieją typy danych dostępne w PL/SQL, które były niedostępne w SQL*Plus. Oracle w wersji 21c umożliwia wykorzystanie niektórych typów danych PL/SQL w definicjach typów SQL*Plus, z zastrzeżeniem, że typy PL/SQL nie będą trwałe. Co to oznacza i jak korzystać z tej nowo odkrytej skarbnicy typów? Przyjrzyjmy się dalej i zobaczmy, co znajdziemy.
Od jakiegoś czasu tworzenie pewnych typów zarówno w PL/SQL, jak i SQL*Plus wymagało zmiany składni — typ z dwoma elementami w PL?SQL jest rekordem, a ta sama konstrukcja typu w SQL*Plus staje się typem obiektowym. Jest to coś, do czego przyzwyczaili się programiści. Jednakże, jeśli te typy muszą zawierać typy PL/SQL (boolean, pls_integer, binary_integer, itp.), niestety w SQL*Plus nie było łatwego sposobu na spełnienie tego wymagania. Do 21c. Przyjrzyjmy się przykładowi wykorzystania takich typów w definicjach typów SQL*Plus. Załóżmy, że jako argument potrzebny jest typ z typem danych BOOLEAN w SQL*Plus. Przed 21c należałoby wykonać DUŻO kodowania, aby naśladować typ danych BOOLEAN — w przypadku 21c możemy użyć BOOLEAN jako typu, o ile baza danych nie próbuje utrwalić danych na dysku:
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.
Taki obiekt można przekazać do jednostki programu PL/SQL z wartością BOOLEAN w czasie wykonywania, a Oracle wie, że wartość BOOLEAN nie ma trwać poza bieżącym kontekstem. Jak wspomniano wcześniej, nie ogranicza się to do wartości BOOLEAN; spróbujmy zarówno PLS_INTEGER, jak i 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.
Żaden typ danych, który nie może być utrwalony w SQL*Plus, nie będzie spowodowany instrukcją „nieutrwalania”, chociaż można je przekazać do jednostki PL/SQL w czasie wykonywania.
Jeśli zastanawiasz się, czy jest to również dostępne do użytku w zagnieżdżonych tabelach i zmiennych, odpowiedź brzmi tak:
SQL> create or replace 2 type i_array as 3 varray(40) of (binary_integer) 4 not persistable; 5 / Type created.
Niestety nie pozwala to na użycie odwołania %TYPE (dobrze znanego i często używanego skrótu z kodowaniem PL/SQL w celu zapewnienia dopasowania typu między kodem PL/SQL a używanymi tabelami) w dowolnym typie przy użyciu dyrektywy „nieutrwalający się”:
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 zrobiło znaczący krok z dyrektywą „nieutrwalającą się”, pozwalającą programistom na wykorzystanie typów danych PL/SQL w definicjach typów SQL*Plus; najprawdopodobniej będzie to miało ograniczone zastosowanie lub będzie atrakcyjne, ponieważ dane reprezentowane przez takie konstrukcje nie będą przechowywane w bazie danych, ale podczas przekazywania wartości BOOLEAN, PL:S_INTEGER lub BINARY_INTEGER z SQL*Plus do jednostek programu PL/SQL może wyeliminować wszelkie problemy z niezgodnością typów spowodowane brakiem takich typów w SQL*Plus. I to jest prawdopodobnie pierwszy krok w rozszerzaniu kompatybilności funkcjonalnej SQL*Plus z PL/SQL.