SQL*Plus a PL/SQL jsou roky v rozporu – existuje mnoho případů, kdy se provedení úlohy pomocí SQL*Plus liší od toho, jak je stejný nebo podobný úkol dokončen v PL/SQL. Navíc jsou v PL/SQL dostupné datové typy, které nebyly dostupné v SQL*Plus. Oracle verze 21c poskytuje způsob, jak používat některé datové typy PL/SQL v definicích typů SQL*Plus, s výhradou, že typy PL/SQL nebudou trvalé. Co to znamená a jak postupovat při používání této nově nalezené pokladnice typů? Podívejme se dále a uvidíme, co najdeme.
Vytváření určitých typů v PL/SQL i SQL*Plus na chvíli zahrnovalo změnu syntaxe – typ se dvěma prvky v PL?SQL je záznam a konstrukce stejného typu v SQL*Plus se stává objektovým typem. To je něco, na co si vývojáři zvykli. Pokud však tyto typy potřebují obsahovat typy PL/SQL (boolean, pls_integer, binary_integer atd.), bohužel v SQL*Plus nebyl žádný snadný způsob, jak tento požadavek splnit. Do 21c. Podívejme se na příklad toho, jak lze takové typy použít v definicích typů SQL*Plus. Řekněme, že jako argument je potřeba typ s datovým typem BOOLEAN v SQL*Plus. Před 21c by bylo nutné provést HODNĚ kódování pro napodobení datového typu BOOLEAN — s 21c můžeme jako typ použít BOOLEAN, pokud se databáze nepokusí uchovávat data na disku:
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.
Takový objekt lze předat programové jednotce PL/SQL s hodnotou BOOLEAN za běhu a Oracle ví, že hodnota BOOLEAN nemá přetrvávat mimo aktuální kontext. Jak bylo uvedeno dříve, není to omezeno na hodnoty BOOLEAN; zkusme PLS_INTEGER 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.
Jakýkoli datový typ, který nelze uchovat v SQL*Plus, nebude způsoben instrukcí „not persistable“, i když je lze za běhu předat jednotce PL/SQL.
Pokud vás zajímá, zda je toto k dispozici také pro použití ve vnořených tabulkách a varrays, odpověď je ano:
SQL> create or replace 2 type i_array as 3 varray(40) of (binary_integer) 4 not persistable; 5 / Type created.
Bohužel to neumožňuje použití odkazu %TYPE (známá a často používaná zkratka s kódováním PL/SQL pro zajištění shody typu mezi kódem PL/SQL a použitými tabulkami) v jakémkoli typu používajícím direktivu „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 udělal významný krok s direktivou „not persistable“, která umožňuje programátorům využívat datové typy PL/SQL v definicích typů SQL*Plus; to bude mít s největší pravděpodobností omezené použití nebo přitažlivost, protože víme, že data reprezentovaná takovými konstrukcemi nebudou uložena v databázi, ale při předávání hodnot BOOLEAN, PL:S_INTEGER nebo BINARY_INTEGER z SQL*Plus do programových jednotek PL/SQL může eliminovat jakékoli problémy s nesouladem typů způsobené tím, že takové typy v SQL*Plus nejsou. A to je pravděpodobně první krok k rozšíření funkční kompatibility SQL*Plus s PL/SQL.