Oracle
 sql >> Base de données >  >> RDS >> Oracle

Solution pour ne pas pouvoir effectuer une opération DML dans une requête ?

Vous pouvez utiliser la directive pragma autonomous_transaction . Cela exécutera la fonction dans une transaction indépendante qui pourra effectuer DML sans augmenter l'ORA-14551.

Sachez que puisque la transaction autonome est indépendante, les résultats du DML seront validés en dehors de la portée de la transaction parente. Dans la plupart des cas, ce ne serait pas une solution acceptable.

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 a une belle explication sur la raison pour laquelle l'erreur est générée en premier lieu. Ce n'est pas sûr car cela peut dépendre de l'ordre dans lequel les lignes sont traitées. De plus, Oracle ne garantit pas que la fonction sera exécutée au moins une fois et au plus une fois par ligne.