Skip to main content
 

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

Number Format

La formattazione numerica si può usare in

  • Funzione TO_CHAR su un datatype numerico, i.e. TO_CHAR(value,'90.99')
  • Funzione TO_NUMBER per convertire un CHAR o un VARCHAR in un datatype numerico, i.e. TO_CHAR('24.33','99.99').

Leggi tutto …Number Format

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;

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