我不能说服我为什么不能在 Oracle Function 内部添加DML操作,尤其是在游标循环内部。我觉得Oracle不支持游标循环内的DML操作。

如果我需要在游标循环内插入表格,该怎么办?在其中创建新的存储过程或其他?

错误消息:无法在查询内部执行DML操作

这是我的职能,

CREATE OR REPLACE FUNCTION TEST_FUNC(U_ID IN VARCHAR2)
RETURN VARCHAR2
IS
  V_MESSAGE VARCHAR2(30);
  CURSOR C_PERSON (V_ID VARCHAR2) IS
         SELECT NAME_UPPER
         FROM TBL_PERSON
         WHERE NAME_UPPER = V_ID;
BEGIN
   FOR C_PERSON_CURSOR IN C_PERSON(U_ID)
   LOOP
       INSERT INTO TMP_PERSON(NAME) VALUES (C_PERSON_CURSOR.NAME_UPPER);
   END LOOP;

   RETURN V_MESSAGE;

EXCEPTION
WHEN OTHERS THEN
    raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
END;

最佳答案

可以在PL/SQL函数中使用DML-没问题。但是,该函数只能从PL/SQL调用,而不能从SQL调用-即可以这样调用:

declare
   l_message varchar2(30);
begin
   l_message := test_func('123');
end;

...但不是这样的:
select test_func(empno) from emp;

这会导致您发布错误消息。

许多人(包括我在内)不喜欢这样具有“副作用”的功能,但这是最佳实践和标准的问题,而不是技术问题。

关于sql - 无法在查询中执行DML操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4095060/

10-11 05:21