[DB2]儲存過程經常使用方法

梓沐發表於2016-02-15

CREATE PROCEDURE SCHEMA.PD_PROCEDURE

(

IN  IN_PARA    VARCHAR(2048),

OUT OUT_PARA   VARCHAR(1024)

)

BEGIN

  DECLARE    V_SQL            VARCHAR(4000)   DEFAULT '';    --存放動態SQL

  DECLARE    V_RTN_FLAG       VARCHAR(1)      DEFAULT '0';   --返回標識

  DECLARE    V_RTN_MSG        VARCHAR(1024)   DEFAULT '';    --返回錯誤資訊

  DECLARE    SQLCODE          INTEGER;                       --SQL程式碼標識

  DECLARE    V_ST             STATEMENT;                     --執行動態SQL用到的引數

  DECLARE SQLEXIT CONDITION FOR SQLSTATE '80001';

  --自定義異常

  DECLARE EXIT HANDLER FOR SQLEXIT

  BEGIN

    SET OUT_PARA='RTN_FLAG=1'||CHR(13)||CHR(10)||'RTN_MSG='||V_RTN_MSG;

  END;

 

  --定義資料庫系統異常

  DECLARE EXIT HANDLER FOR SQLEXCEPTION

  BEGIN

    GET DIAGNOSTICS EXCEPTION 1 V_RTN_MSG=MESSAGE_TEXT;

    SET OUT_PARA='RTN_FLAG=1'||CHR(13)||CHR(10)||'RTN_MSG='||V_RTN_MSG;

  END;

 

  --根據判斷條件,返回不同異常

  IF NOT EXISTS(SELECT 1 FROM TEST WHERE TEST='Y') THEN

    SET V_RTN_MSG='*********執行本操作!';

    SIGNAL SQLEXIT;

  END IF;

 

  --返回結果集

  BEGIN

    DECLARE V_RTN_CUR CURSOR WITH RETURN FOR   

      SELECT * FROM DB2INST1.TB_TEST;

      ORDER BY SETDATE FETCH FIRST 3 ROWS ONLY;

    OPEN V_RTN_CUR;

  END;

 
  --生成uuid
  select concat(hex(RAND()), hex(RAND())) into v_uuid from SYSIBM.SYSDUMMY1;

  --生成時間戳充當uuid
  select replace(replace(char(current timestamp),'-',''),'.','') from SYSIBM.dual


  --執行動態SQL

  BEGIN

    SET V_SQL='INSERT INTO DB2INST1.TB_TEST_'||V_DATE||' SELECT * FROM DB2INST1.TB_TEST;';

    PREPARE V_ST FROM V_SQL;

    EXECUTE V_ST;

  END;

  --校驗兩張表的資料是否完全相同

  IF EXISTS

   (SELECT 1

    FROM

    (

     SELECT STD_ID,BS_FLAG,STD_NUM,SJ_NO,SJ_DATE,DEAR_DATE,DEAR_NO

     FROM DB2INST1.TB_HOLD_CHECK

     WHERE OPEN_STATUS='B'

     ) T1

     FULL JOIN

     (

     SELECT STDID,BUYORSAL,STDNUM,STDNO,STDDATE,FADATE,CNTNO

     FROM DB2INST1.TB_CNTRACT

     WHERE OPEN_STATE='B'

     ) T2

     ON T1.SJ_NO=T2.STDNO AND T1.SJ_DATE=T2.STDDATE AND T1.DEAR_NO=T2.CNTNO AND T1.DEAR_DATE=T2.FADATE    

     WHERE COALESCE(STD_NUM,0)<>COALESCE(STDNUM,0)

   ) THEN

    STD V_ERRMSG='校驗失敗,****************';

    STD V_FLAG = '1';

    --插入錯誤記錄表

    INSERT INTO DB2INST1.TB_CHECK_RESULT(CLOSE_DATE,CHECK_NAME,CHECK_STEP,CHECK_RESULT,CHECK_MSG,OPR_USER,OPR_DATE)

    VALUES(CURRENT_DATE,'PD_PROCEDURE','STEP*',V_FLAG,V_ERRMSG,'ADMIN',CURRENT_DATE);

   END IF;

  --程式無異常,返回的結果

  SET OUTPARA='RTN_FLAG=0'||CHR(13)||CHR(10)||'RTN_MSG=操作成功!';

 

END;


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29812844/viewspace-1988821/,如需轉載,請註明出處,否則將追究法律責任。

相關文章