Skip to main content
 

Estrarre dati da un XML Type

E' spesso utile accedere ai dati contenuti in una vriabile XML TYpe, usando l' SQL come se fossero in una tabella o vista.

XML ha per sua stessa natura una struttura gerarchica. Di conseguenza viene facile pensare ad un file XML come a record di tabelle legate tra loro da relazioni master-detail.

Pensiamo ad un documento XML memorizzato nella colonna XML Type di una tabella Oracle:

<root> 
   <master id ='A'> 
    <info>First Header</info> 
      <detail> 
        <info>Detail 1</info> 
      </detail> 
      <detail> 
        <info>Detail 2</info> 
      </detail> 
   </master> 
   <master id = 'B'> 
      <info>Second Header</info> 
      <detail> 
           <info>Detail 3</info> 
      </detail> 
   </master>
</root>

Creeremo due viste ("dumb_master" e "dumb_detail") connesse da relazione master-detail relationship e popolate dai dati contenuti nell' XML Document della colonna dumb.dumber.

Oracle

Leggi tutto …Estrarre dati da un XML Type

Update basata su variabile record

Questo costrutto aggiorna ogni colonna di un record con i dati contenuti in un variabile difinita con ROWTYPE. Potrebbe quindi innescare lock delle chiavi di una foreign key.

DECLARE
  p_rec  t%ROWTYPE;
BEGIN
  ...
 
  p_rec.column_x := 'AA';
  p_rec.column_y := 'BB';
 
  ...
 
  UPDATE t
  SET ROW = trec
  WHERE column_z = 'CC';
 
  ....
END;

Info taken from http://psoug.org/reference/update.html

Oracle, PL/SQL

All' interno di un trigger, sottomettere PL/SQL DOPO il commit

A volte è necessario seguire del codice PL/SQL all'itnerno di un trigger, e questo pezzo di codice necessita di avere visione delle modifiche apportate ai dalla transazione all'interno della quale è stato lanciato il trigger stesso. Per esempio la sottomissione di una coda di lavoro, oppure il lancio di un report. All'interno dei trigger non è possibile, per ovvi motivi, eseguire un commit. Si otterrebbe l'errore oracle:

ORA-04091: table name is mutating, trigger/function may not see it

La soluzione è usare dbms_job.submit.

Leggi tutto …All' interno di un trigger, sottomettere PL/SQL DOPO il commit

Uso dei ref-Cursors

Uso di OPEN-FOR, FETCH, eCLOSE

Un SQL dinamico rappresenta una SELECT che resistuisce più righe può essere procvessato in modo nativo come segue:

  1. Uso un OPEN-FOR per associare la/le variabili al SQL dinamico. La clausula USING di OPEN-FOR specifica un 'bind' tra un parametro e un segnaposto all' interno dell SQL
  2. La clausula USING non può speicificare il valore NULL, un possibile workaround è l'uso di una variabile non inizializzata come quiExample 7-3
  3. Per dettagli sulla sintassi vai a OPEN-FOR Statement.
  4. Uso una FETCH per recuperare i record uno alla volta
  5. Per dettagli sulla sintassi vai a FETCH Statement
  6. Usate CLOSe per chiudere il ref-cursor
  7. Per dettagli sulla sitnassi CLOSE Statement.

Dynamic

Leggi tutto …Uso dei ref-Cursors

Oracle JUtils

JUtils è un set di package PL/SQL che facilita molto la vita con Oracle (11g). Qui la home page del progetto.

Description

Permette di effettuare operazioni in poche manciate di righe di codice come : scaricare/caricare LOBs, calcolare CRC, ottenre il mie type di un BLOB, inviare messaggi XMPP, elencare directory su filesistem come se fossero i record di una tabella, interagire con Twitter, gestire QrCodes, ...

Features

  • Inviare messaggi XMPP da Oracle
  • Calcolare checkum e mimeType su tipi binary come BLOB, CLOB
  • Zip/unzip BLOB
  • caricare e scaricare BLOB con una singola istruzione SQL
  • Interagire con Twitter (lista amici Friends, Favorites, Timelines, post Status, ...)
  • Encode/Decode QrCodes da SQL

11g