- 论坛徽章:
- 0
|
CLP应该没什么问题,本身就是支持外部调用CALL RPG PARM(&XXX &XXX)。
个人觉得存储过程应该修改一下,Store Procedure使用交易处理主要体现在三个控制语句上:
COMMIT
ROLLBACK
SET TRANSACTION
你把这3项写到Store Procedure里面去,不要写在CLP里面。
例如:下面的实例实现的功能是对客户库中的所有客户记录,如果全部成功才提交,如果有一个失败则全部回滚整个交易。
你参照修改一下你的Store Procedure,然后运行一下,调试通过后,可将CLP中加入RUNSQLSTM调用Store Procedure语句。
- SET TRANSACTION LEVEL CHG; //改变交易处理的默认方式为CHG
- CREATE PROCEDURE CREDITP
- (IN i_perinc DECIMAL(3,2),
- INOUT o_numrec DECIMAL(5,0))
- LANGUAGE SQL
- BEGIN //Store Procedure实体
- DECLARE proc_cusnbr CHAR(5);
- DECLARE proc_cuscrd DECIMAL(11,2);
- DECLARE numrec DECIMAL(5,0);
- DECLARE at_end INT DEFAULT 0;
- DECLARE not_found
- CONDITION FOR '02000';
- DECLARE c1 CURSOR FOR
- SELECT cusnbr, cuscrd
- FROM ordapplib.customer;
- DECLARE CONTINUE HANDLER FOR not_found
- SET at_end = 1;
- SET numrec = 0;
- DECLARE EXIT HANDLER FOR SQLEXCEPTION
- ROLLBACK; ----//遇到任何SQL的异常,都默认执行ROLLBACK,回滚交易。
- OPEN c1;
- FETCH c1 INTO proc_cusnbr, proc_cuscrd;
- WHILE at_end = 0 DO
- SET proc_cuscrd = proc_cuscrd +(proc_cuscrd * i_perinc);
- UPDATE ordapplib.customer
- SET cuscrd = proc_cuscrd
- WHERE CURRENT OF c1;
- SET numrec = numrec + 1;
- FETCH c1 INTO proc_cusnbr, proc_cuscrd;
- END WHILE;
- SET o_numrec = numrec;
- CLOSE c1;
- COMMIT; //交易正常结束,提交数据库进行更新。
- END
复制代码 |
|