Oracle
 sql >> Database >  >> RDS >> Oracle

Soluzione per non eseguire un'operazione DML all'interno di una query?

Potresti usare la direttiva pragma autonomous_transaction . Ciò eseguirà la funzione in una transazione indipendente che sarà in grado di eseguire DML senza aumentare l'ORA-14551.

Tieni presente che, poiché la transazione autonoma è indipendente, i risultati del DML verranno confermati al di fuori dell'ambito della transazione principale. Nella maggior parte dei casi non sarebbe una soluzione alternativa accettabile.

SQL> CREATE OR REPLACE FUNCTION supercomplex(datainput IN VARCHAR2)
  2     RETURN VARCHAR2 IS
  3     PRAGMA AUTONOMOUS_TRANSACTION;
  4  BEGIN
  5     INSERT INTO dumtab VALUES (datainput);
  6     COMMIT;
  7     RETURN 'done';
  8  END supercomplex;
  9  /

Function created

SQL> SELECT supercomplex('somevalue') FROM dual;

SUPERCOMPLEX('SOMEVALUE')
--------------------------------------------------------------------------------
done

SQL> select * from dumtab;

A
--------------------------------------------------------------------------------
somevalue

Tom Kyte ha una bella spiegazione sul perché l'errore viene sollevato in primo luogo. Non è sicuro perché può dipendere dall'ordine in cui le righe vengono elaborate. Inoltre, Oracle non garantisce che la funzione venga eseguita almeno una volta e al massimo una volta per riga.