Oracle

使用者定義的函式只能有選擇語句

  • April 27, 2018

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

但是你應該這樣做嗎?我不這麼認為。

引用自:https://dba.stackexchange.com/questions/205170