1. 程式人生 > >DB2儲存過程例項(如果用慣了ORACLE會發現很不習慣)

DB2儲存過程例項(如果用慣了ORACLE會發現很不習慣)



CREATE OR REPLACE PROCEDURE LOY.TEST1 ( )
---此處忽略就行了,這個是db2自動為我們生成的
  SPECIFIC SQL180919100638350
  LANGUAGE SQL
  NOT DETERMINISTIC
  EXTERNAL ACTION
  MODIFIES SQL DATA
  CALLED ON NULL INPUT
  INHERIT SPECIAL REGISTERS
  OLD SAVEPOINT LEVEL
--建立儲存過程
BEGIN
--以下是生成變數,其實沒啥說的
DECLARE custNo VARCHAR(50);
DECLARE cardNo VARCHAR(50);
DECLARE mainFlag VARCHAR(50);
DECLARE mainCardNo VARCHAR(50);
DECLARE orgNo VARCHAR(50);
DECLARE acct_open_date VARCHAR(50);
DECLARE status VARCHAR(50);
DECLARE createDate VARCHAR(50);
DECLARE cardno_linshi VARCHAR(50);
DECLARE sql_linshi VARCHAR(100);
DECLARE stuInfor_end INTEGER  DEFAULT 0;
DECLARE num INTEGER  DEFAULT 0;
DECLARE sum INTEGER  DEFAULT 0;
DECLARE countSum INTEGER  DEFAULT 0;

----宣告遊標,此處加了關鍵之 with hold  
---這個關鍵詞的含義是,出現了某條記錄異常的時候遊標繼續執行,不加這個引數則遊標會
---停止。但是親測好像出了異常都會停止,該引數確實意義不大,不過你加上就行了。明白了----嗎?
DECLARE stuInfor CURSOR with hold  FOR (
select 
SC_BIZ_DEPOSIT_PERSON.CST_ID as CUST_NO,
	CRD_AR_ID as CARD_NO,
	'' as MAIN_FLAG,
	'' as MAIN_CARD_NO,
	OPNG_OU_IP_ID as ORG_NO,
	EFC_DT as ACCT_OPEN_DATE,
	'' as status,
	'20180919' as create_date
	from SC_BIZ_DEPOSIT_PERSON  where length(CRD_AR_ID)!=0 
);
--這裡到下面的ROLLBACK的end;  此處是固定模式(可以直接黏貼到你的儲存過程中),意思是遊標結束以後,設定我們的標誌為1
--1,否則它一直是定義的時候的值為0.
DECLARE CONTINUE HANDLER FOR NOT FOUND
begin
SET stuInfor_end = 1;--
end;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
begin
ROLLBACK;--
end;
---到上面這是固定模式

open stuInfor;--當定義完遊標後,遊標需要開啟後使用
---開啟遊標設定到自己的變數中,這幾個變數是自己定義的,也就是有幾個欄位,定義幾個變---量,注意順序不能改變
FETCH stuInfor  INTO  custNo,cardNo,mainFlag,mainCardNo,orgNo,acct_open_date,status,createDate;--
WHILE stuInfor_end = 0 DO
---fetch first 1 rows only是db2的函式,意思是取出第一條資料
---select into 意思是設定到查詢的結果到變數中,注意此處必須返回一條資料。否則報錯。
---儲存過程報錯直接就退出了,不會提示錯誤,明白嗎?
   select count(1) into countSum  from DB_DEBIT_CARD 
				where card_No=cardNo fetch first 1 rows only;
    ---注意if then 和end if;為固定語法
    --if (條件) then
    --elseif(條件) then
    --else
    ---end if;
    if countSum=0  then
	 insert into DB_DEBIT_CARD ( CUST_NO, CARD_NO, 
      MAIN_FLAG, MAIN_CARD_NO, ORG_NO, 
      ACCT_OPEN_DATE, STATUS, CREATE_DATE 
      ) values (custNo,cardNo,mainFlag,mainCardNo,orgNo,acct_open_date,status,createDate);	
    end if;	
---每次要重新設定值,此處千萬注意。
FETCH stuInfor  INTO  custNo,cardNo,mainFlag,mainCardNo,orgNo,acct_open_date,status,createDate;

----設定變數一定要用set,此處是坑
  set num=num+1;
  set sum= MOD(num,1000);
    if(sum=0) then 
      commit;
    end if;
END  WHILE;--
CLOSE stuInfor;--關閉遊標
END;


使用習慣了oracle,突然來了db2還真有點不適應。

                                   20100920 -於江西南昌農商行管理處