Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Rozwiązanie problemu nie można wykonać operacji DML w zapytaniu?

Możesz użyć dyrektywy pragma autonomous_transaction . Spowoduje to uruchomienie funkcji w niezależnej transakcji, która będzie w stanie wykonać DML bez podnoszenia ORA-14551.

Należy pamiętać, że ponieważ transakcja autonomiczna jest niezależna, wyniki DML zostaną zatwierdzone poza zakresem transakcji nadrzędnej. W większości przypadków nie byłoby to akceptowalne obejście.

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 ma ładne wyjaśnienie, dlaczego w pierwszej kolejności pojawia się błąd. Nie jest to bezpieczne, ponieważ może zależeć od kolejności przetwarzania wierszy. Ponadto Oracle nie gwarantuje, że funkcja zostanie wykonana co najmniej raz i najwyżej raz na wiersz.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nazwa kolumny tabeli Oracle ze spacją

  2. Wymuszaj ograniczenie klucza obcego do kolumn tej samej tabeli

  3. Przykłady dla kursorów PLSQL - kursory jawne, niejawne i odsyłające

  4. Oracle:jak dodać minuty do znacznika czasu?

  5. 4 sposoby znajdowania wierszy zawierających wielkie litery w Oracle