Oracle
使用者定義的函式只能有選擇語句
UDF 和 SP 之間的主要區別之一是 UDF 只能在其中包含 select 語句,而不能包含 insert/update/delete 語句。有人可以解釋這背後的原因嗎?下面的函式:
create function test(..) ... BEGIN insert into EMPLOYEE('22',12000,'john'); return 0; END
無效。但為什麼會這樣呢?
這與功能(UDF)與過程無關。這是您使用它們的上下文。
您可以在函式中進行 DML 操作:
SQL> create table t1 (c1 number); Table created. SQL> create or replace function f1 return number as 2 begin 3 insert into t1 values (1); 4 commit; 5 return 0; 6 end; 7 / Function created. SQL> declare 2 i number; 3 begin 4 i := f1; 5 end; 6 / PL/SQL procedure successfully completed. SQL> select * from t1; C1 ---------- 1
但是,如果您在查詢中使用函式 as 和 UDF:
SQL> select f1 from dual; select f1 from dual * ERROR at line 1: ORA-14551: cannot perform a DML operation inside a query ORA-06512: at "BP.F1", line 3
您仍然可以使用自治事務解決此問題:
SQL> create or replace function f2 return number as 2 pragma autonomous_transaction; 3 begin 4 insert into t1 values (1); 5 commit; 6 return 0; 7 end; 8 / Function created. SQL> select f2 from dual; F2 ---------- 0 SQL> select * from t1; C1 ---------- 1 1
但是你應該這樣做嗎?我不這麼認為。