gpt4 book ai didi

stored-procedures - 带有存储过程调用的 BEFORE INSERT 触发器 (DB2 LUW 9.5)

转载 作者:行者123 更新时间:2023-12-04 07:42:12 27 4
gpt4 key购买 nike

我正在尝试创建一个 BEFORE INSERT 触发器,它将检查字段的传入值,如果该字段为空,则将其替换为另一行中的相同字段。但是,当我将 CALL 语句添加到我的触发器时,返回错误“触发器“ORGSTRUCT.CSTCNTR_IN”是使用不受支持的触发 SQL 语句定义的”。我检查了文档,发现 BEFORE 中不支持游标(首先创建存储过程的部分原因),但即使我从存储过程中删除游标声明,调用仍然会产生相同的错误.

触发器:

CREATE TRIGGER orgstruct.cstcntr_IN
NO CASCADE
BEFORE INSERT ON orgstruct.tOrgs
REFERENCING NEW AS r
FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC
DECLARE prnt_temp BIGINT;
DECLARE cstcntr_temp CHAR(11);

SET prnt_temp = r.prnt;
SET cstcntr_temp = r.cstcntr;

CALL orgstruct.trspGetPrntCstCntr(prnt_temp,cstcntr_temp);
SET r.cstcntr = cstcntr_temp;
END

存储过程:

CREATE PROCEDURE orgstruct.trspGetPrntCstCntr (
IN p_prnt BIGINT,
OUT p_cstcntr CHAR(11)
)
SPECIFIC trGetPrntCstCntr
BEGIN
IF p_prnt IS NULL THEN
RETURN;
END IF;

BEGIN
DECLARE c1 CURSOR
FOR
SELECT cstcntr
FROM orgstruct.tOrgs
WHERE id = p_prnt
FOR READ ONLY;
OPEN c1;
FETCH FROM c1 INTO p_cstcntr;
CLOSE c1;
END;
END

根据文档,CALL 允许在 BEFORE 触发器中,所以我不明白问题出在哪里。

最佳答案

before 触发器可以调用存储过程,但存储过程不能执行触发器中不允许的任何操作。

在您的情况下,SQL 存储过程的默认数据访问级别是 MODIFIES SQL DATA,这在触发器中是不允许的。您可以重新创建存储过程,将数据访问级别更改为 READS SQL DATA;这将允许您创建触发器。

但是:没有理由为这么简单的事情调用存储过程;您可以使用简单的内联触发器来完成:

create trigger orgstruct.cstcntr_IN
no cascade
before insert on orgstruct.tOrgs
referencing new as r
for each row
mode db2sql
set r.cstcntr = case
when r.p_prnt is not null
then (select cstcntr from tOrgs where id = r.p_prnt fetch first 1 row only)
else r.cstcntr
end;

这将更加高效,因为它消除了存储过程调用和存储过程中的游标处理。即使您想使用存储过程,也可以消除存储过程中的游标并提高性能。

仅供引用:您发布的逻辑包含错误,并且始终将 CSTCNTR 设置为 NULL。此答案中发布的触发器不会执行此操作。 :-)

关于stored-procedures - 带有存储过程调用的 BEFORE INSERT 触发器 (DB2 LUW 9.5),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5223400/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com