Oracle
 sql >> база данни >  >> RDS >> Oracle

Решение да не може да изпълни DML операция в заявка?

Можете да използвате директивата pragma autonomous_transaction . Това ще изпълни функцията в независима транзакция, която ще може да изпълнява DML, без да повдига ORA-14551.

Имайте предвид, че тъй като автономната транзакция е независима, резултатите от DML ще бъдат ангажирани извън обхвата на родителската транзакция. В повечето случаи това не би било приемливо решение.

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

Том Кайт има хубаво обяснение защо грешката се повдига на първо място. Не е безопасно, защото може да зависи от реда, в който се обработват редовете. Освен това Oracle не гарантира, че функцията ще бъде изпълнена поне веднъж и най-много веднъж на ред.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. dbms_output.put_line

  2. Какъв е най-добрият начин да се определи коя версия на клиента Oracle използвам?

  3. Преброяване на броя на поява на символ в Oracle SQL

  4. има ли начин да регистрирате всички неуспешни sql оператори в oracle 10g

  5. Как да дадете уникално ограничение на комбинация от колони в Oracle?