我可以在 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 函数中执行更新吗?的主要内容,如果未能解决你的问题,请参考以下文章
oracle sql DEVELOPER ORA-12535: TNS: 操作超时