sql >> Databáze >  >> RDS >> Oracle

Změna definice TYPU v Oracle 21c

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.


  1. Jak opravit ERROR 1130 (HY000):Hostitel se nemůže připojit k tomuto serveru MySQL

  2. SQL kromě

  3. Funkce LOG() v Oracle

  4. Základní správa Oracle 12c Multitenant