自己整理的學習資料——DB2 V8資料庫基礎(十三)

rheet1978發表於2008-09-23

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         儲存過程中SQLCODESQLSTATE的使用:

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部落格 ” ,連結:http://blog.itpub.net/9524210/viewspace-462716/,如需轉載,請註明出處,否則將追究法律責任。

相關文章