Skip to main content
 

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

Evitare di restare in attesa con ORA-00054: risorsa occupata

L'errore in questione, Oracle ORA-00054: resource busy and acquire with NOWAIT specified  (in italiano, ORA-00054: risorsa occupata, acquisizione con NOWAIT specificato o timeout scaduto), viene lanciato quando si tenta di acquisire un lock su una risorsa in modalità NOWAIT, e la risolrsa risulta già loccata da un altra sessione. Senza NOWAIT il codice resterebbe bloccato in attesa del rilascio del lock. Con NOWAIT il codice non si blocca e scatena l'eccezione.

Intercettare l'errore con un blocco exception è molto semplice, e vi permette di gestire la mancata acquisizione del lock in modo pulito:

DECLARE
  resource_busy EXCEPTION;
  PRAGMA EXCEPTION_INIT(resource_busy, -54);
BEGIN
   ...
   select {column_list} from {table_name} where {where_clause} for update nowait;
   ....
EXCEPTION
WHEN resource_busy THEN
  /*
* Il codice di gestione
* della mancata acquisizione del lock va qui
*/ END;

Oracle, Lock

Chiamata URL da PL/SQL

Il package da utilizzare si chiama UTL_URL, qui la documentazione Oracle ufficiale.

Codice di esempio:

declare 
 req   UTL_HTTP.REQ;
 resp  UTL_HTTP.RESP;
 value VARCHAR2(1024);
BEGIN
 UTL_HTTP.SET_PROXY('proxy.my-company.com', 'corp.my-company.com');
 req := UTL_HTTP.BEGIN_REQUEST('http://...............');
 UTL_HTTP.SET_HEADER(req, 'User-Agent', 'Mozilla/4.0');
 resp := UTL_HTTP.GET_RESPONSE(req);
 LOOP
 UTL_HTTP.READ_LINE(resp, value, TRUE);
 DBMS_OUTPUT.PUT_LINE(value);
 END LOOP;
 UTL_HTTP.END_RESPONSE(resp);
EXCEPTION
 WHEN UTL_HTTP.END_OF_BODY THEN
 UTL_HTTP.END_RESPONSE(resp);
END;