Db2触发器引用在其上创建插入前触发器的同一表



在Db2版本10.x中,我在TEST 表上创建了一个插入前触发器

CREATE OR REPLACE TRIGGER TRG_TEST_INSERT
BEFORE INSERT ON TEST 
REFERENCING NEW AS OBJ
FOR EACH ROW MODE DB2SQL
WHEN (((SELECT CheckCount('SELECT count(1) FROM TEST') FROM SYSIBM.SYSDUMMY1)));

这个功能:

--FUNCTION
CREATE OR REPLACE FUNCTION CheckCount(query varchar(1000)) 
RETURNS INTEGER
LANGUAGE SQL 
dfl:BEGIN 
DECLARE id INTEGER;
DECLARE cur CURSOR for st1;
PREPARE st1 FROM query;
open cur;
fetch from cur into id;
return id;
close cur;
END dfl*/

我打电话给udf来检查同一张桌子上的计数。但我得到以下错误SQLCODE=-746,SQLSTATE=57053

SQL0746N名为"(具体名称"quot;(失败,因为例程违反了嵌套SQL当试图执行操作"时的语句规则"在名为"&";。

说明:

当应用程序调用一个尝试以与的其他用途冲突的方式访问表由应用程序或直接调用的例程或间接来自该应用程序。

因为我的before触发器在同一个表上。如何在不出现此类错误的情况下检查计数?

了解过程从表读取或写入表时的数据冲突
您可以将函数逻辑重写为SP调用:

CREATE OR REPLACE PROCEDURE CheckCount(query varchar(1000), out cnt int) 
LANGUAGE SQL 
BEGIN
PREPARE S1 FROM 'SET ? = (' || query || ')';
EXECUTE S1 INTO cnt;
END@

并在你的触发器中使用它,如下所示:

CREATE OR REPLACE TRIGGER TRG_TEST_INSERT
BEFORE INSERT ON TEST 
REFERENCING NEW AS OBJ
FOR EACH ROW MODE DB2SQL
BEGIN
DECLARE V_CNT INT;
--SET V_CNT = CHECKCOUNT('SELECT count(1) FROM TEST5');
CALL CHECKCOUNT('SELECT count(1) FROM TEST', V_CNT);
IF <some expressin with V_CNT>
THEN
...
END IF;   
END
@

如果您仍然得到SQL0746N(如果需要的话,我手头没有10.x,也不记得了(,请按照描述中的建议,以实例所有者(Linux、Unix(或本地管理员(Windows(的身份在服务器上运行以下程序,然后重新创建例程和触发器:

db2set DB2_RESOLVE_CALL_CONFLICT=YES -immediate

最新更新