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
在 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