Kettle 怎样执行事务(利用存储过程除外)?

我需要执行一个 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 语句:

  1. 查询数据: select count(*) from MasterIndex where DATAINDEX=?;
  2. 更新数据: update MasterIndex set JCGWINDEX=?, MODIFYTIME=sysdate where IDCARDNO=? and NAME=?;
  3. 插入数据: insert into MasterIndex (DATAINDEX,IDCARDNO,NAME,JCGWINDEX,MODIFYTIME) values (?,?,?,?,sysdate);

然后,通过使用 Kettle 中的‘执行 SQL 脚本’控件,分别执行这三个 SQL 语句,并在这三个控件之间设置一个转换步骤来实现事务性的操作。如果其中任何一个 SQL 语句执行失败,整个事务都将回滚。