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

TIPO Modifica della definizione in Oracle 21c

SQL*Plus e PL/SQL sono in disaccordo da anni:abbondano i casi in cui il modo in cui un'attività viene eseguita utilizzando SQL*Plus è diverso dal modo in cui un'attività uguale o simile viene completata in PL/SQL. Inoltre, sono disponibili tipi di dati in PL/SQL che non erano disponibili in SQL*Plus. Oracle versione 21c fornisce un modo per utilizzare alcuni dei tipi di dati PL/SQL nelle definizioni dei tipi SQL*Plus, con l'avvertenza che i tipi PL/SQL non saranno persistenti. Cosa significa questo e come si fa a usare questo nuovo tesoro di tipi? Indaghiamo ulteriormente e vediamo cosa troviamo.

Per un po' di tempo la creazione di determinati tipi sia in PL/SQL che in SQL*Plus ha comportato un cambiamento nella sintassi:un tipo con due elementi in PL?SQL è un record e la stessa costruzione del tipo in SQL*Plus diventa un tipo di oggetto. Questo è qualcosa a cui gli sviluppatori si sono abituati. Tuttavia, se questi tipi devono contenere tipi PL/SQL (boolean, pls_integer, binary_integer, ecc.), purtroppo non esisteva un modo semplice in SQL*Plus per soddisfare tale requisito. Fino al 21c. Diamo un'occhiata a un esempio di come tali tipi possono essere utilizzati nelle definizioni di tipo SQL*Plus. Diciamo che, per argomento, è necessario un tipo con un tipo di dati BOOLEAN in SQL*Plus. Prima di 21c sarebbe necessario eseguire MOLTE codifiche per imitare il tipo di dati BOOLEAN — con 21c possiamo usare BOOLEAN come tipo, a condizione che il database non tenti di rendere persistenti i dati su disco:

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.

Tale oggetto può essere passato a un'unità di programma PL/SQL con il valore BOOLEAN in fase di esecuzione e Oracle sa che il valore BOOLEAN non deve persistere al di fuori del contesto corrente. Come affermato in precedenza, questo non è limitato ai valori BOOLEANI; proviamo sia un PLS_INTEGER che un 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.

Qualsiasi tipo di dati che non può essere persistente in SQL*Plus non sarà dovuto all'istruzione "non persistente", sebbene possano essere passati a un'unità PL/SQL in fase di esecuzione.

Se ti stai chiedendo se questo è disponibile anche per l'uso in tabelle nidificate e varray, la risposta è sì:

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

Type created.

Sfortunatamente ciò non consente di utilizzare un riferimento %TYPE (una scorciatoia ben nota e spesso utilizzata con la codifica PL/SQL per garantire la corrispondenza dei tipi tra il codice PL/SQL e le tabelle utilizzate) in alcun tipo utilizzando la direttiva "non persistente":

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 ha compiuto un passo significativo con la direttiva "non persistente", consentendo ai programmatori di utilizzare i tipi di dati PL/SQL nelle definizioni dei tipi SQL*Plus; questo, molto probabilmente, avrà un uso o un fascino limitato sapendo che i dati rappresentati da tali costrutti non saranno archiviati nel database, ma quando si passano valori BOOLEAN, PL:S_INTEGER o BINARY_INTEGER da SQL*Plus alle unità di programma PL/SQL è possibile eliminare eventuali problemi di mancata corrispondenza dei tipi causati dalla mancanza di tali tipi in SQL*Plus. E questo è probabilmente il primo passo per espandere la compatibilità funzionale di SQL*Plus con PL/SQL.