DB2儲存過程例項(如果用慣了ORACLE會發現很不習慣)
阿新 • • 發佈:2018-12-10
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 -於江西南昌農商行管理處