触发器又有有关问题
触发器又有问题
create trigger tr_del_jgxx
after delete on sys_jgxx
referencing old as o
for each row
MODE DB2SQL
begin
declare v_unit_id varchar(256) default'';
declare v_sql varchar(2000) default'';
--错误代码相关定义
declare V_SQL_CODE INT DEFAULT 0;
declare V_SQL_MSG VARCHAR(500) DEFAULT '';
declare V_JOB_ROWS INT DEFAULT 0;
declare V_SQL_STATE CHAR(5) DEFAULT '00000';
declare SQLSTATE CHAR(5) DEFAULT '00000'; -- db2错误信息
declare SQLCODE INT DEFAULT 0; -- db2错误代码
--错误处理
DECLARE EXIT HANDLER FOR SQLEXCEPTION
H1:BEGIN
GET DIAGNOSTICS EXCEPTION 1 V_SQL_MSG = MESSAGE_TEXT; -- 捕获错误描述
SELECT SQLSTATE,SQLCODE INTO V_SQL_STATE,V_SQL_CODE FROM SYSIBM.SYSDUMMY1; -- 捕获错误信息及其代码
END H1;
insert into test values(o.jlid,'记录id');
set v_sql='insert into TEST2 ';
set v_sql=v_sql||'with rpl(jlid,sjjlid,unit_id,jgxxgqc,jgjb) as';
set v_sql=v_sql||'(';
set v_sql=v_sql||'select jlid,sjjlid,unit_id,jgxxqc,jgjb from sys_jgxx where jgjb='||o.jgjb||' and jlid='||''''||o.jlid||'''';
set v_sql=v_sql||'union all ';
set v_sql=v_sql||'select child.JLID,child.SJJLID,child.UNIT_ID,child.JGXXQC,child.JGJB from sys_jgxx child,rpl parent where child.SJJLID=parent.jlid and parent.jgjb='||o.jgjb;
set v_sql=v_sql||')';
set v_sql=v_sql||'select unit_id from rpl';
insert into test values(11,v_sql);
execute immediate v_sql;
insert into test values(11,'OK');
insert into test values(o.jlid,'记录id2');
end;
大家好,我把直接执行test表里记录的sql,完全没有问题,往test2表里插了3条数据,
但是在这个触发器执行完后,却没有往test2表里插数据,是为什么呢?
------解决方案--------------------
如果用这么复杂的游标到时候难免会出问题,如果可以的话把游标的处理逻辑放到跟insert into test values(11,v_sql)同一事物里就可以了,这样反而更容易维护
------解决方案--------------------
把那几个o.什么的也插到test里边看看,估计没捕获正确
create trigger tr_del_jgxx
after delete on sys_jgxx
referencing old as o
for each row
MODE DB2SQL
begin
declare v_unit_id varchar(256) default'';
declare v_sql varchar(2000) default'';
--错误代码相关定义
declare V_SQL_CODE INT DEFAULT 0;
declare V_SQL_MSG VARCHAR(500) DEFAULT '';
declare V_JOB_ROWS INT DEFAULT 0;
declare V_SQL_STATE CHAR(5) DEFAULT '00000';
declare SQLSTATE CHAR(5) DEFAULT '00000'; -- db2错误信息
declare SQLCODE INT DEFAULT 0; -- db2错误代码
--错误处理
DECLARE EXIT HANDLER FOR SQLEXCEPTION
H1:BEGIN
GET DIAGNOSTICS EXCEPTION 1 V_SQL_MSG = MESSAGE_TEXT; -- 捕获错误描述
SELECT SQLSTATE,SQLCODE INTO V_SQL_STATE,V_SQL_CODE FROM SYSIBM.SYSDUMMY1; -- 捕获错误信息及其代码
END H1;
insert into test values(o.jlid,'记录id');
set v_sql='insert into TEST2 ';
set v_sql=v_sql||'with rpl(jlid,sjjlid,unit_id,jgxxgqc,jgjb) as';
set v_sql=v_sql||'(';
set v_sql=v_sql||'select jlid,sjjlid,unit_id,jgxxqc,jgjb from sys_jgxx where jgjb='||o.jgjb||' and jlid='||''''||o.jlid||'''';
set v_sql=v_sql||'union all ';
set v_sql=v_sql||'select child.JLID,child.SJJLID,child.UNIT_ID,child.JGXXQC,child.JGJB from sys_jgxx child,rpl parent where child.SJJLID=parent.jlid and parent.jgjb='||o.jgjb;
set v_sql=v_sql||')';
set v_sql=v_sql||'select unit_id from rpl';
insert into test values(11,v_sql);
execute immediate v_sql;
insert into test values(11,'OK');
insert into test values(o.jlid,'记录id2');
end;
大家好,我把直接执行test表里记录的sql,完全没有问题,往test2表里插了3条数据,
但是在这个触发器执行完后,却没有往test2表里插数据,是为什么呢?
------解决方案--------------------
如果用这么复杂的游标到时候难免会出问题,如果可以的话把游标的处理逻辑放到跟insert into test values(11,v_sql)同一事物里就可以了,这样反而更容易维护
------解决方案--------------------
把那几个o.什么的也插到test里边看看,估计没捕获正确