sql - 无法在查询中执行 DML 操作

标签 sql oracle

我无法说服为什么我不能在 中添加 DML 操作Oracle 函数 特别是里面游标循环 .我觉得 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/

相关文章:

sql - 如何获取表的 SQL 脚本?

sql - 如果值存在则返回 true 的聚合函数

sql - 两个主键引用一个外键

mysql - 如果存在则更新表否则插入

Python SQL 单次提交与多次提交

sql - 像另一个一样创建一个配置单元表,但按键分区

oracle - 在 SQL*Plus 中声明绑定(bind)变量

mysql - 如果 userid = x 且 eventid = x,则 SQL 设置为 yes

java - 道: diffrence between InMemory implementation and Database Implementation

linux - azure walinuxagent : no package available on oracle linux 6. 5