ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 自己整理的学习资料——DB2 V8数据库基础(十三)

自己整理的学习资料——DB2 V8数据库基础(十三)

原创 Linux操作系统 作者:rheet1978 时间:2008-09-23 23:23:09 0 删除 编辑

2.7   存储过程procedure

l         在aix环境中需要IBM VASUALAGE C++5.0编译器(8.1版之前需要单独安装)

Connect to sample

Create procedure begin   end

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 存储过程

------------------------------------------------------------------------

P1: BEGIN

-- 声明变量

--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

 DECLARE cursor1 CURSOR  FOR

  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;

   END IF ;

                    

  --主键列不能为空

   IF  (S_HYZGID   IS  NULL   )THEN

       SIGNAL   SQLSTATE '98000'

       SET MESSAGE_TEXT='THE PRIMARY KEY IS NOT PERMIT NULL :HYZGID'    ;

   END IF ;

                    

  --对表进行转换,当增量标志为'I'的时候,只对目标表进行插入 ;当增量标志为‘D’的时候,对目标表相应行进行删除操作;当增量标志为‘U’的时候,先执行删除再执行插入

 

   IF    (S_OPERATION='I' )  THEN

      insert into YHS.FPGL_HYDKZG(HYZGID,NSRSH,NSRMC,SHWDJZH,

CZYID,FJID,NSRFJID,SQRQ,DQZT)

values(S_HYZGID,S_NSRSH,S_NSRMC,S_SHWDJZH,S_CZYID,S_FJID,S_NSRFJID,S_SQRQ,

S_DQZT) ;

   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,

CZYID,FJID,NSRFJID,SQRQ,DQZT)

values(S_HYZGID,S_NSRSH,S_NSRMC,S_SHWDJZH,S_CZYID,S_FJID,S_NSRFJID,S_SQRQ,

S_DQZT) ;

    END IF ;

 

  --删除中间源表的相应行

    delete from   yhs.tgtfp_hydkzg  where    HYZGID =S_HYZGID;

 

  --操作行数加1

   SET  rowcount=rowcount+1;

       END LOOP ;

       CLOSE cursor1;

  RETURN     rowcount;

END P1                                                                                             

  

本节未完,因为系统格式原因,下篇继续

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9524210/viewspace-462716/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2008-06-09

  • 博文量
    84
  • 访问量
    548250