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

Løsning til ikke at udføre en DML-handling i en forespørgsel?

Du kunne bruge direktivet pragma autonomous_transaction . Dette vil køre funktionen ind i en uafhængig transaktion, der vil være i stand til at udføre DML uden at hæve ORA-14551.

Vær opmærksom på, at da den autonome transaktion er uafhængig, vil resultaterne af DML blive forpligtet uden for rammerne af modertransaktionen. I de fleste tilfælde ville det ikke være 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 fin forklaring på, hvorfor fejlen er rejst i første omgang. Det er ikke sikkert, fordi det kan afhænge af rækkefølgen, som rækkerne behandles i. Desuden garanterer Oracle ikke, at funktionen udføres mindst én gang og højst én gang pr. række.



  1. Konfigurer SQL Server Always ON Tilgængelighedsgrupper mellem to synkrone replikaer. Del 2

  2. Postgresql opretter ikke db med "createdb" som superbruger, men udsender ikke fejl

  3. Hvordan bruger man global midlertidig tabel i Oracle-proceduren?

  4. 2 måder at sammenkæde strenge og tal i MariaDB