sql >> Databasteknik >  >> RDS >> Oracle

TYP Definitionsändring i Oracle 21c

SQL*Plus och PL/SQL har varit motstridiga i åratal - det finns många fall där hur en uppgift utförs med SQL*Plus skiljer sig från hur samma eller liknande uppgift slutförs i PL/SQL. Dessutom finns det datatyper tillgängliga i PL/SQL som inte har varit tillgängliga i SQL*Plus. Oracle version 21c ger ett sätt att använda några av PL/SQL-datatyperna i SQL*Plus-typdefinitioner, med förbehållet att PL/SQL-typerna inte kommer att vara beständiga. Vad betyder detta och hur går man tillväga för att använda denna nyfunna skattkammare av typer? Låt oss undersöka vidare och se vad vi hittar.

Sedan ett tag har skapat vissa typer i både PL/SQL och SQL*Plus inneburit en förändring i syntax — en typ med två element i PL?SQL är en post, och samma typkonstruktion i SQL*Plus blir en objekttyp. Detta är något utvecklare har blivit vana vid att göra. Men om dessa typer behöver innehålla PL/SQL-typer (boolean, pls_integer, binary_integer, etc.) fanns det tyvärr inget enkelt sätt i SQL*Plus att uppfylla det kravet. Till 21c. Låt oss titta på ett exempel på hur sådana typer kan användas i SQL*Plus-typdefinitioner. Låt oss säga, för argument, en typ behövs med en BOOLEAN datatyp i SQL*Plus. Före 21c skulle det vara nödvändigt att göra MYCKET kodning för att efterlikna BOOLEAN-datatypen — med 21c kan vi använda BOOLEAN som en typ, så länge som databasen inte försöker bevara data till disk:

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.

Ett sådant objekt kan skickas till en PL/SQL-programenhet med BOOLEAN-värdet vid körning och Oracle vet att BOOLEAN-värdet inte ska bestå utanför det aktuella sammanhanget. Som nämnts tidigare är detta inte begränsat till BOOLEAN-värden; låt oss prova både en PLS_INTEGER och 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.

Alla datatyper som inte kan bevaras i SQL*Plus beror inte på instruktionen "not persistable", även om de kan skickas till en PL/SQL-enhet vid körning.

Om du undrar om detta också är tillgängligt för användning i kapslade tabeller och varrays, är svaret ja:

SQL> create or replace
  2  type i_array as
  3  varray(40) of (binary_integer)
  4  not persistable;
  5  /

Type created.

Tyvärr tillåter detta inte användning av en %TYPE-referens (en välkänd och ofta använd genväg med PL/SQL-kodning för att säkerställa typmatchning mellan PL/SQL-kod och tabellerna som används) i någon typ som använder direktivet "icke 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 har tagit ett betydande steg med direktivet "icke persistable", som tillåter programmerare att använda PL/SQL-datatyper i SQL*Plus-typdefinitioner; detta kommer sannolikt att ha begränsad användning eller tilltalande med vetskap om att data som representeras av sådana konstruktioner inte kommer att lagras i databasen, men när BOOLEAN-, PL:S_INTEGER- eller BINARY_INTEGER-värden överförs från SQL*Plus till PL/SQL-programenheter kan det eliminera eventuella problem med typfel som orsakas av att inte ha sådana typer i SQL*Plus. Och detta är förmodligen det första steget i att utöka SQL*Plus funktionella kompatibilitet med PL/SQL.


  1. MySQL:Hur man tillåter fjärranslutning till mysql

  2. Returnera antalet rader som påverkas av UPDATE-satser

  3. MS SQL Server på Linux vs Windows Performance Test för att upptäcka skillnaden

  4. Vad är en frågeavvikare och hur man åtgärdar det