sql >> Base de Datos >  >> RDS >> Oracle

¿Solución para no poder realizar una operación DML dentro de una consulta?

Podrías usar la directiva pragma autonomous_transaction . Esto ejecutará la función en una transacción independiente que podrá realizar DML sin generar el ORA-14551.

Tenga en cuenta que dado que la transacción autónoma es independiente, los resultados del DML se confirmarán fuera del alcance de la transacción principal. En la mayoría de los casos, esa no sería una solución aceptable.

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 tiene una buena explicación sobre por qué se genera el error en primer lugar. No es seguro porque puede depender del orden en que se procesan las filas. Además, Oracle no garantiza que la función se ejecutará al menos una vez y como máximo una vez por fila.