【问题标题】:Can I perform update inside PL/SQL function?我可以在 PL/SQL 函数中执行更新吗?
【发布时间】: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;

标签: oracle plsql stored-functions


【解决方案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函数的预期目的是返回一个值,而不是修改数据。
猜你喜欢
  • 2019-11-30
  • 2016-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-01
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多