sql >> Database teknologi >  >> RDS >> Oracle

TYPE Definition Ændring i Oracle 21c

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.


  1. En uventet bivirkning ved at tilføje et filtreret indeks

  2. Parallelle udførelsesplaner – grene og tråde

  3. Identifikation af ASH-sekvenskondition i RAC

  4. Fælles tabeludtryk i MySQL