Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Solução para não conseguir realizar uma operação DML dentro de uma consulta?


Você pode usar a diretiva pragma autonomous_transaction . Isso executará a função em uma transação independente que poderá executar DML sem aumentar o ORA-14551.

Esteja ciente de que, como a transação autônoma é independente, os resultados da DML serão confirmados fora do escopo da transação pai. Na maioria dos casos, essa não seria uma solução alternativa aceitável.
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 tem uma boa explicação sobre por que o erro é gerado em primeiro lugar. Não é seguro porque pode depender da ordem em que as linhas são processadas. Além disso, a Oracle não garante que a função será executada pelo menos uma vez e no máximo uma vez por linha.