sql >> Database >  >> RDS >> Oracle

Oplossing om geen DML-bewerking binnen een query uit te voeren?

Je zou de richtlijn pragma autonomous_transaction . kunnen gebruiken . Hierdoor wordt de functie in een onafhankelijke transactie uitgevoerd die DML kan uitvoeren zonder de ORA-14551 te verhogen.

Houd er rekening mee dat, aangezien de autonome transactie onafhankelijk is, de resultaten van de DML worden vastgelegd buiten de reikwijdte van de bovenliggende transactie. In de meeste gevallen zou dat geen acceptabele oplossing zijn.

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 heeft een mooie uitleg over waarom de fout in de eerste plaats wordt opgeworpen. Het is niet veilig omdat het kan afhangen van de volgorde waarin de rijen worden verwerkt. Bovendien garandeert Oracle niet dat de functie minimaal één keer en maximaal één keer per rij wordt uitgevoerd.



  1. Postgresql extract laatste rij voor elke id

  2. Databasequery-efficiëntie maximaliseren voor MySQL - deel twee

  3. Unicode-tekenreeks (हिन्दी) opslaan en weergeven met behulp van PHP en MySQL

  4. Wat is de locatie van mysql-client .my.cnf in XAMPP voor Windows?