我可以在 PL/SQL 函数中执行更新吗?

Posted

技术标签:

【中文标题】我可以在 PL/SQL 函数中执行更新吗?【英文标题】:Can I perform update inside PL/SQL function? 【发布时间】:2021-01-12 18:30:02 【问题描述】:

是否可以在函数内更新表?因为我的什么都不做..

CREATE OR REPLACE FUNCTION rep_ort(id INT, status VARCHAR2, end_date DATE, explanation VARCHAR2) 
RETURN VARCHAR2
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
UPDATE reports
SET 
id = id,
status = status,
end_date = end_date,
explanation = explanation;
commit;
RETURN 'Updated';
END;

select rep_ort('5','Closed','2021-01-12 17:30','Client fault') from dual;

【问题讨论】:

可能不相关:你不应该在 WHERE 子句中使用 id 而不是在 SET 子句中使用 id 吗? 也许吧,但它应该是什么样子?哪里 id = id? WHERE id = id 什么都不做... 使用与列名不同的参数名 你应该使用一个过程。当您在函数中进行更新(或任何其他 DML)时,您不能像 select rep_ort(...) from dual 那样使用它,请使用 begin ret:= rep_ort(...); end; 【参考方案1】:

你什么也没做,因为你用与列相同的名称命名参数,所以你只是将整个表更新为相同的值。

重命名参数并 - 可能 - 包括 WHERE 子句。

虽然您可以做到这一点,但程序就是用于此目的。

CREATE OR REPLACE FUNCTION rep_ort
  (p_id INT, p_status VARCHAR2, p_end_date DATE, p_explanation VARCHAR2)
RETURN VARCHAR2
IS
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  UPDATE reports
  SET
   id          = p_id,
   status      = p_status,
   end_date    = p_end_date,
   explanation = p_explanation;

  commit;
  RETURN 'Updated';
END;

【讨论】:

伙计,就是这样!!我需要使用 WHERE 子句,但仅此而已。亮了,非常感谢。 @Trapist_e:请将答案标记为已解决。 WHERE 可能已经解决了您眼前的问题,但我要重申@wernfried Domscheit 的评论,即您不应该为此使用 function函数的预期目的是返回一个值,而不是修改数据。

以上是关于我可以在 PL/SQL 函数中执行更新吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 PL/sql 函数进行 SQL 更新

可以在 PL/SQL 函数中使用正则表达式吗?

oracle sql DEVELOPER ORA-12535: TNS: 操作超时

如何在 Dbms_output.put_line(''); 中使用 <br> 标签在 PL/SQL 甲骨文中?

我们可以在一个 PL/SQL 块中使用多个函数吗

PL/SQL 函数返回错误结果