SQL*Plus og PL/SQL har været uenige i årevis - der er mange tilfælde, hvor hvordan en opgave udføres ved hjælp af SQL*Plus adskiller sig fra, hvordan den samme eller lignende opgave udføres i PL/SQL. Derudover er der tilgængelige datatyper i PL/SQL, som ikke har været tilgængelige i SQL*Plus. Oracle version 21c giver mulighed for at bruge nogle af PL/SQL-datatyperne i SQL*Plus-typedefinitioner, med det forbehold, at PL/SQL-typerne ikke vil være vedvarende. Hvad betyder det, og hvordan går man frem for at bruge denne nyfundne skattekiste af typer? Lad os undersøge nærmere og se, hvad vi finder.
I et stykke tid involverede oprettelse af bestemte typer i både PL/SQL og SQL*Plus en ændring i syntaks — en type med to elementer i PL?SQL er en post, og den samme typekonstruktion i SQL*Plus bliver en objekttype. Dette er noget, udviklere er blevet vant til at gøre. Men hvis disse typer skal indeholde PL/SQL-typer (boolean, pls_integer, binary_integer osv.), var der desværre ingen nem måde i SQL*Plus at opfylde dette krav. Indtil 21c. Lad os se på et eksempel på, hvordan sådanne typer kan bruges i SQL*Plus-typedefinitioner. Lad os sige, som argument, en type er nødvendig med en BOOLEAN datatype i SQL*Plus. Før 21c ville det være nødvendigt at lave en masse kodning for at efterligne BOOLEAN-datatypen - med 21c kan vi bruge BOOLEAN som en type, så længe databasen ikke forsøger at bevare dataene til disken:
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.
Et sådant objekt kan sendes til en PL/SQL-programenhed med BOOLEAN-værdien ved kørsel, og Oracle ved, at BOOLEAN-værdien ikke skal bestå uden for den aktuelle kontekst. Som nævnt tidligere er dette ikke begrænset til BOOLEAN-værdier; lad os prøve både en PLS_INTEGER og en 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.
Enhver datatype, der ikke kan bevares i SQL*Plus, vil ikke være på grund af instruktionen "ikke persistable", selvom de kan videregives til en PL/SQL-enhed under kørsel.
Hvis du spekulerer på, om dette også er tilgængeligt til brug i indlejrede tabeller og varrays, er svaret ja:
SQL> create or replace 2 type i_array as 3 varray(40) of (binary_integer) 4 not persistable; 5 / Type created.
Desværre tillader dette ikke brug af en %TYPE-reference (en velkendt og ofte brugt genvej med PL/SQL-kodning for at sikre typematching mellem PL/SQL-kode og de anvendte tabeller) i nogen type, der bruger "ikke persistable"-direktivet:
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 har taget et væsentligt skridt med "ikke persistable"-direktivet, der tillader programmører at bruge PL/SQL-datatyper i SQL*Plus-typedefinitioner; dette vil højst sandsynligt have begrænset brug eller tiltrækningskraft ved at vide, at data repræsenteret af sådanne konstruktioner ikke vil blive lagret i databasen, men når BOOLEAN-, PL:S_INTEGER- eller BINARY_INTEGER-værdier overføres fra SQL*Plus til PL/SQL-programenheder, kan det eliminere eventuelle typer uoverensstemmelsesproblemer forårsaget af ikke at have sådanne typer i SQL*Plus. Og dette er sandsynligvis det første skridt i at udvide SQL*Plus funktionelle kompatibilitet med PL/SQL.