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.