Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Giải pháp để không thể thực hiện một hoạt động DML bên trong một truy vấn?

Bạn có thể sử dụng chỉ thị pragma autonomous_transaction . Điều này sẽ chạy chức năng thành một giao dịch độc lập có thể thực hiện DML mà không cần nâng ORA-14551.

Lưu ý rằng vì giao dịch tự quản là độc lập, kết quả của DML sẽ được cam kết bên ngoài phạm vi của giao dịch mẹ. Trong hầu hết các trường hợp, đó không phải là một giải pháp được chấp nhận.

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 đã có một lời giải thích tốt về lý do tại sao lỗi được nêu ra ngay từ đầu. Nó không an toàn vì nó có thể phụ thuộc vào thứ tự các hàng được xử lý. Hơn nữa, Oracle không đảm bảo rằng hàm sẽ được thực thi ít nhất một lần và nhiều nhất một lần trên mỗi hàng.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để thay đổi ràng buộc

  2. Lưu trữ Hùng do ORA-16484 TƯƠNG THÍCH

  3. Oracle Apex 5.0 - Hiển thị hình ảnh tĩnh

  4. ORA-00932:kiểu dữ liệu không nhất quán:mong đợi - có CLOB

  5. Làm thế nào để có được ngày hôm qua trong Oracle