l 在aix环境中需要IBM VASUALAGE C++5.0编译器(8.1版之前需要单独安装)
Connect to sample
Create procedure
Drop procedure
l 从7.1版本后存储过程可以用SQL语句来创建。
l 执行存储过程
DB2CALL
l 存储过程中SQLCODE、SQLSTATE的使用:
n DECLARE SQLSTATE CHAR(5)
n DECLARE SQLCODE INT
n SQLCODE =100 没有发现数据
=0 成功
>0 成功但有警告
<0 不成功
n SQLSTATE
Success: SQLSTATE '00000'
Not found: SQLSTATE '02000'
Warning: SQLSTATE '01XXX'
Exception: Everything else
Specific conditions:
SQLSTATE 01004: 字符串值在指定给具有较短长度的另一字符串
数据类型时被截断。
Can assign names to condition:
DECLARE trunc CONDITION FOR SQLSTATE '01004'
l 举例说明存储过程,如下所示:
CREATE PROCEDURE YHS.HYDKZG ( )
------------------------------------------------------------------------
-- SQL 存储过程
------------------------------------------------------------------------
-- 声明变量
--at_end表示游标是否到尾部标志 , rowcount表示更新的行数
DECLARE at_end INT DEFAULT 0 ;
DECLARE rowcount INT DEFAULT 0 ;
--中间源表各个列对应的变量
DECLARE S_HYZGID BIGINT;
DECLARE S_NSRSH VARCHAR(25);
DECLARE S_NSRMC VARCHAR(100);
DECLARE S_SHWDJZH VARCHAR(50);
DECLARE S_CZYID VARCHAR(10);
DECLARE S_FJID VARCHAR(30);
DECLARE S_NSRFJID VARCHAR(30);
DECLARE S_SQRQ TIMESTAMP;
DECLARE S_DQZT CHARACTER(1);
-- 增量标志,I代表增加、U代表更新、D代表删除
DECLARE S_OPERATION CHARACTER(1);
--声明游标
-- 本例以(3707 潍坊市地税局 G0 )为例 ,中间源表为yhs.tgtfp_hydkzg ,中间目的表为YHS.FPGL_HYDKZG
--实际部署的时候中间目的表模式名要改成各个地市前缀 ,根据性能的不同,FETCH的行数可以根据实际需要调整,建议不要超过10000
SELECT HYZGID,case when NSRSH like 'g0%' then insert(NSRSH,1,2,'') else NSRSH end ,
NSRMC,SHWDJZH,CZYID,FJID,NSRFJID,SQRQ,DQZT,IBMSNAP_OPERATION
FROM yhs.tgtfp_hydkzg
WHERE NSRFJID LIKE '3707%'
ORDER BY IBMSNAP_LOGMARKER FETCH FIRST 100 ROWS ONLY ;
-- 当游标到结尾的时候给变量 at_end 赋值为 1
DECLARE CONTINUE HANDLER FOR NOT FOUND SET at_end = 1;
-- 客户机应用程序的游标保持打开
OPEN cursor1;
select_Loop:
LOOP
FETCH FROM cursor1 INTO S_HYZGID,S_NSRSH,S_NSRMC,S_SHWDJZH,S_CZYID,
S_FJID,S_NSRFJID,S_SQRQ,S_DQZT,S_OPERATION ;
--当游标到达尾部的时候退出循环
IF (at_end=1) THEN
LEAVE select_Loop;
--主键列不能为空
IF (S_HYZGID IS NULL )THEN
SIGNAL SQLSTATE '98000'
SET MESSAGE_TEXT='THE PRIMARY KEY IS NOT PERMIT NULL :HYZGID' ;
--对表进行转换,当增量标志为'I'的时候,只对目标表进行插入 ;当增量标志为‘D’的时候,对目标表相应行进行删除操作;当增量标志为‘U’的时候,先执行删除再执行插入
IF (S_OPERATION='I' ) THEN
insert into YHS.FPGL_HYDKZG(HYZGID,NSRSH,NSRMC,SHWDJZH,
values(S_HYZGID,S_NSRSH,S_NSRMC,S_SHWDJZH,S_CZYID,S_FJID,S_NSRFJID,S_SQRQ,
ELSEIF (S_OPERATION='D' ) THEN
delete from YHS.FPGL_HYDKZG where HYZGID =S_HYZGID;
ELSEIF (S_OPERATION='U' ) THEN
delete from YHS.FPGL_HYDKZG where HYZGID =S_HYZGID;
insert into YHS.FPGL_HYDKZG(HYZGID,NSRSH,NSRMC,SHWDJZH,
values(S_HYZGID,S_NSRSH,S_NSRMC,S_SHWDJZH,S_CZYID,S_FJID,S_NSRFJID,S_SQRQ,
--删除中间源表的相应行
delete from yhs.tgtfp_hydkzg where HYZGID =S_HYZGID;
--操作行数加1
SET rowcount=rowcount+1;
END LOOP ;
CLOSE cursor1;
RETURN rowcount;
本节未完,因为系统格式原因,下篇继续
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9524210/viewspace-462716/ ,如需转载,请注明出处,否则将追究法律责任。