sql >> Databasteknik >  >> RDS >> Oracle

Lösning för att inte kunna utföra en DML-operation i en fråga?

Du kan använda direktivet pragma autonomous_transaction . Detta kommer att köra funktionen i en oberoende transaktion som kommer att kunna utföra DML utan att höja ORA-14551.

Var medveten om att eftersom den autonoma transaktionen är oberoende, kommer resultaten av DML att begås utanför omfattningen av modertransaktionen. I de flesta fall skulle det inte vara en acceptabel lösning.

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 har en bra förklaring om varför felet tas upp i första hand. Det är inte säkert eftersom det kan bero på i vilken ordning raderna bearbetas. Dessutom garanterar inte Oracle att funktionen kommer att köras minst en gång och högst en gång per rad.



  1. pgmemcache Installation och användning

  2. Hur man konverterar från ett datumformat till ett annat i SQL Server med CONVERT()

  3. Hur tar man bort vagnreturer och nya rader i Postgresql?

  4. Hur man skapar pivottabell i PostgreSQL