Db2 触发器引用相同的 table,在此之前创建插入触发器

Db2 trigger referencing same table on which this before insert trigger is created

在 Db2 版本 10.x 中,我在 table 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 来检查相同 table 上的计数。但是我收到以下错误 SQLCODE=-746, SQLSTATE=57053

SQL0746N The routine named "" (specific name "") failed because the routine violated nested SQL statement rules when attempting to perform operation "" on the table named "".

Explanation:

This message is returned when an application calls a routine that attempts to access a table in a way that conflicts with other uses of the table by either the application, or a routine invoked directly or indirectly from that application.

因为我的前触发器在同一个 table 上。如何在没有 运行 的情况下检查计数?

了解 Data conflicts when procedures read from or write to tables
您可以将函数逻辑重写为 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