Skip to main content
 

Scrivere SQL dinamici

Si tratta di tecniche per mettono di scrivere il testo dell' SQL a runtime.

Tutto questo permette di scrivere codice d' uso generale, scalabile e riutilizzabile poichè il testo dell SQL non è conosciuto in fase di compilazione. Per esempio siamo in grado di scrivere una procedure che lancia istruzioni DML su una tabella il cui nome non è conosciuto fino a runtime.

Oracle mette a disposizione due sistemi per realizzare SQL dinamici:

  • Cursori parametrici
  • Il package DBMS_SQL e EXCE_SQL

Oracle 9i Docs

Dynamic

Function Based Index

I 'Function Based Indexes' (FBIs) vengono utilizzati per creare indici basati non su un set di colonne appartenenti ad una tabella, ma sul risultato di una stored function applicata alle colonne di una tabella.

Vengono usati quando ci si trova di fronte la necessità di scrivere select filtrate secondo i risultati di una stored function, e non ci si possono permettere i tempi di una inevitabile ACCESS FULL da parte dell'ottimizzatore Oracle.

Sono necessari i seguenti requisiti per attivarle su database Oracle (da 8i in avanti):

  1. Parametro query_rewrite_enabled = true
    • alter session/system set query_rewrite_enabled = true;
  2. Parametro query_rewrite_integrity = trusted
    • alter system set query_rewrite_integrity = trusted;
  3. La function di database sulla quale è basato l'FBI deve essere di tipo deterministic. Significa che, a parità di parametri in input, la function restituirà sempre lo stesso risultato in output. Cioè permette ad Oracle di costruire l'indice e di mantenerlo coerente nel tempo.
    • create or replace 
      function function_name(col1 in varchar2, col2 in date)
      return varchar2 deterministic is ....
  4. A questo punto è possibile creare l'indice in un modo del tutto simile a quelli classici:
    • create index table_name_idx on table_name(function_name(col1, col2));
  5. La select, per poter usare l'indice, deve passare alla function esattamente le stesse colonne presenti nella definizione dell'FBI, inoltre potrebbe essere necessario forzare Oracle ad usare l'indice tramite un hint, soprattutto se l'ottimizzatore è forzato a RULE.
    • select /*+ index(table_name, table_name_idx) */ * 
      from table_name
      where function_name(col1, col2) = 'ABC';

DBMS_LOCK - Accesso agli Oracle Lock Management services

Il package DBMS_LOCK permette di accedere ai servizi del sistema di gestione dei lock di Oracle. Si può richiedere un lock con una marticolare modalità di condivisione, fornendogli un particolare nome per riferirvi in altre procedure per cambiare il lock mode oppure rilasciarlo.

Alcuni utilizzi:

  • Forzare accesso esclusivo ad un device particolare, come un terminal
  • Rilevare quando un lock viene rilasciato ed effetture eventuali operazioni di pulizia
  • Sincronizzare le applicazioni e forzare esecusioni sequenziali

Oracle Online Docs

Non serve per lavorare sui lock già presenti nel sistema.

Lock

Accesso al filesystem del server Oracle

Il package DBMS_FILE_TRANSFER mette a disposizione procedure per copiare file binary all'interno di un database o rta database diversi. Per esempio:

  1. Copia file da una source directory all' altra. Le due directory possono essere entrambe sul filesystem locale, oppure entrambe nell Automatic Storage Management (ASM) disk group, o anche essere in situazioni miste in entrambe le direzioni.
  2. Si sollega ad un db remoto e legge un file remoto creandone una copia sul filesystem o ASM locali
  3. Legge il filesystem locale o ASM e si collega ad un database remoto per crearvi una copia del file

NB. Non lavora sul DB nel senso stretto del termine, vale a dire su colonne LOB o CLOB.

Oracle, Filesystem