Skip to main content
 

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

Da Clob a Blob

Questo codice PL/SQL converte una variabile clob a una blob.

function clob_to_blob(c in clob) return blob is
    -- typecasts CLOB to BLOB (binary conversion)
   pos PLS_INTEGER := 1;
   buffer RAW( 32767 );
   res BLOB;
   lob_len PLS_INTEGER := DBMS_LOB.getLength( c );
BEGIN
   DBMS_LOB.createTemporary( res, TRUE );
   DBMS_LOB.OPEN( res, DBMS_LOB.LOB_ReadWrite );
   
   LOOP
    buffer := UTL_RAW.cast_to_raw( DBMS_LOB.SUBSTR( c, 16000, pos ) );

    IF UTL_RAW.LENGTH( buffer ) > 0 THEN
       DBMS_LOB.writeAppend( res, UTL_RAW.LENGTH( buffer ), buffer );
    END IF;

    pos := pos + 16000;
    EXIT WHEN pos > lob_len;
   END LOOP;

   RETURN res;
END;

PL/SQL, Clob & Blob

Creare documenti XML Docs da PL/SQL

Using XML-SQL Utility (XSU)

XML-SQL Utility (XSU) fornisce un sistema semplice di trasfomazione mappando ogni query SQL con ZML e viceversa. XSU fornisce le funzionalità di base per ottenre e salvare dati da e verso il database.

DECLARE
  queryCtx dbms_xmlquery.ctxType;
  result CLOB;
BEGIN
  -- set up the query context
  queryCtx := dbms_xmlquery.newContext(
    'SELECT ''Miao'' tag1
          , ''Ciao''   tag2
          , ''Bau''    tag3
       FROM dual'
  );
  
  dbms_xmlquery.setRowTag(
      queryCtx
    , 'header'
  );
  dbms_xmlquery.setRowSetTag(
      queryCtx
    , 'message'
  );  
  result := dbms_xmlquery.getXml(queryCtx);
  dbms_output.put_line(result);
  dbms_xmlquery.closeContext(queryCtx);   
end;

E questo è il risultato:

<?xml version = '1.0'?>
<message>
   <header num="1">
      <TAG1>Miao</TAG1>
      <TAG2>Ciao</TAG2>
      <TAG3>Bau</TAG3>
   </header>
</message>

PL/SQL, XML

Carica un BLOB da BFILE

Questo è un esempio:

procedure load_attachment(dir in varchar2, nam in varchar2) is
 fl BFILE;
 att blob;
 begin
 Dbms_Lob.createtemporary(att, TRUE, Dbms_Lob.CALL); 
 fl := BFileName(dir, nam);
 if (dbms_lob.fileexists(fl) = 1) then
 
 Dbms_Lob.fileopen(fl, Dbms_Lob.LOB_READONLY);
 Dbms_Lob.loadfromfile(att, fl, Dbms_Lob.getlength(fl));
 Dbms_Lob.fileclose(fl);

 ....
 else
 dbms_output.put_line('File doesn't exists!');
 end if;  
 end;

Se ottenete l' errore Oracle ORA-22275 - invalid LOB locator specified, forse avete dimenticato l' istruzione Dbms_Lob.createtemporary.

Oracle, Clob & Blob, Filesystem