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.