Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Zmiana definicji TYP w Oracle 21c

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Samouczek ORACLE SQL*Plus

  2. Funkcja HEXTORAW() w Oracle

  3. Jak sklonować użytkownika w Oracle

  4. TNSPING OK ale sqlplus daje ORA-12154?

  5. Czy można uruchomić skrypt SQLPLUS na pliku zakodowanym jako UTF-8 z BOM?