我需要执行一个 if else 结构的事务块,但是在 ‘执行sql脚本‘控件一直执行不成功,如下语句
declare tempCount int;
begin
select count(*) into tempCount from MasterIndex where DATAINDEX='?';
if tempCount>0 then
update MasterIndex set JCGWINDEX='?',MODIFYTIME=sysdate where IDCARDNO='?' and NAME='?';
else
insert into MasterIndex (DATAINDEX,IDCARDNO,NAME,JCGWINDEX,MODIFYTIME) values ('?','?','?','?',sysdate);
end if;
commit;
end;
针对这个问题,Kettle 是通过使用 JDBC 库来执行 SQL 语句实现事务的。但是,由于 Kettle 并不支持存储过程的执行,所以你需要将这个事务块拆分成几个 SQL 语句分别执行。
对于你给出的 SQL 语句,可以重构成以下三个 SQL 语句:
select count(*) from MasterIndex where DATAINDEX=?;
update MasterIndex set JCGWINDEX=?, MODIFYTIME=sysdate where IDCARDNO=? and NAME=?;
insert into MasterIndex (DATAINDEX,IDCARDNO,NAME,JCGWINDEX,MODIFYTIME) values (?,?,?,?,sysdate);
然后,通过使用 Kettle 中的‘执行 SQL 脚本’控件,分别执行这三个 SQL 语句,并在这三个控件之间设置一个转换步骤来实现事务性的操作。如果其中任何一个 SQL 语句执行失败,整个事务都将回滚。