1. 程式人生 > 其它 >DB2儲存過程模板(儲存過程舉例、編譯、執行)

DB2儲存過程模板(儲存過程舉例、編譯、執行)

技術標籤:DB2儲存過程sqldb2資料庫

一、DB2儲存過程中日誌表建表語句:

create table db2inst1.dim_proc_run_log  
(
   proc_name varchar(200) , 
   proc_para varchar(20) , 
   step_no integer , 
   step_desc varchar(100) , 
   step_over_time timestamp , 
   step_records integer 
)distribute by hash(proc_name,proc_para,step_no) in userspace1 not
logged initially ; --註釋 comment on table db2inst1.dim_proc_run_log is '儲存過程執行日誌表'; comment on column db2inst1.dim_proc_run_log.proc_name is '儲存過程名稱'; comment on column db2inst1.dim_proc_run_log.proc_para is '資料賬期'; comment on column db2inst1.dim_proc_run_log.step_desc is '步驟說明'; comment on column db2inst1.
dim_proc_run_log.step_no is '步驟'; comment on column db2inst1.dim_proc_run_log.step_over_time is '執行結束時間'; comment on column db2inst1.dim_proc_run_log.step_records is '更新記錄數';

二、儲存過程舉例(SQL檔案):proc_test_proc.sql

create or replace procedure db2inst1.proc_test_proc (in i_date varchar(20),out o_return_code integer
, out o_return_msg varchar(300) ) p1: begin --***************************************************************************************** -- sql 儲存過程 -- 名稱 : proc_test_proc -- 頻率 : 日 -- 引數 : i_date: 統計日期 -- o_return_code: 返回值 -- o_return_msg: 返回資訊 -- 功能描述 : 測試 -- 返回值 : 0 正確; <0 錯誤 -- 輸入表 : db2inst1.dual -- 輸出表 : test_proc -- 建立日期 : 19991231 -- 建立人 : test -- 修改歷史 : 修改人 修改時間 主要改動說明 -- test 19991231 新增 -- test1 29991231 修改 --***************************************************************************************** --宣告 declare sqlcode integer default 0; declare retcode integer default 0; declare vs_bcyc_id varchar(20); --統計日期(yyyy-mm-dd) declare vi_bcyc_id varchar(8); --統計日期(yyyymmdd) declare vs_dynstr1 varchar(200); --存放動態sql執行語句 declare vs_proc_name varchar(50); --存放日誌表儲存過程名 declare vi_proc_para varchar(20); --存放日誌表儲存過程引數 declare vi_step_no integer; --存放日誌表步驟序號 declare vs_step_desc varchar(100); --存放日誌表步驟描述 declare vi_step_records integer default 0; --更新記錄數 --宣告異常 declare continue handler for sqlexception set retcode = sqlcode; declare continue handler for sqlwarning set retcode = sqlcode; declare continue handler for not found set retcode = sqlcode; --賦值 set o_return_code = 0; set o_return_msg = '儲存過程未執行!'; set vs_proc_name = 'db2inst1.proc_test_proc'; set vi_proc_para = i_date; set vs_bcyc_id = i_date; --傳入日期引數 set vi_bcyc_id = to_char(date(vs_bcyc_id),'yyyymmdd'); ----------------------------------------------------------------------------------------------- --向日志表插入資料 ----------------------------------------------------------------------------------------------- set vi_step_no = 0; set vs_step_desc = '儲存過程執行開始!'; --log delete from db2inst1.dim_proc_run_log where (proc_name=vs_proc_name and proc_para=vi_proc_para) or proc_para is null; insert into db2inst1.dim_proc_run_log(proc_name,proc_para,step_no,step_desc,step_over_time,step_records) values (vs_proc_name,vi_proc_para,vi_step_no,vs_step_desc,current timestamp,0); commit; ----------------------------------------------------------------------------------------------- --清空當前週期數據 ----------------------------------------------------------------------------------------------- set vi_step_no = 1; set vs_step_desc = '清空結果表當前週期數據'; --[sql] delete from db2inst1.test_proc where dw_date=vi_bcyc_id; commit; --[sql] --判斷sql返回值是否正常 if retcode < 0 then set o_return_code = retcode; set o_return_msg = 'sql'||char(vi_step_no)||':'||vs_step_desc||'出錯!'; rollback; --err_log insert into db2inst1.dim_proc_run_log(proc_name,proc_para,step_no,step_desc,step_over_time,step_records) values (vs_proc_name,vi_proc_para,-1,o_return_msg||'sql_code:'||char(o_return_code),current timestamp,0); --err_log return o_return_code; else set retcode = 0; commit; end if; --log insert into db2inst1.dim_proc_run_log(proc_name,proc_para,step_no,step_desc,step_over_time,step_records) values (vs_proc_name,vi_proc_para,vi_step_no,vs_step_desc,current timestamp,0); commit; ----------------------------------------------------------------------------------------------- --生成結果表 ----------------------------------------------------------------------------------------------- set vi_step_no = 2; set vs_step_desc = '生成結果表'; --[sql] insert into db2inst1.test_proc select vi_bcyc_id as dw_date , a.userid from db2inst1.dual a ; --[sql] --獲取更新條數 get diagnostics vi_step_records = row_count; if retcode < 0 then set o_return_code = retcode; set o_return_msg = 'sql'||char(vi_step_no)||':'||vs_step_desc||'出錯!'; rollback; --err_log insert into db2inst1.dim_proc_run_log(proc_name,proc_para,step_no,step_desc,step_over_time,step_records) values (vs_proc_name,vi_proc_para,-1,o_return_msg||'sql_code:'||char(o_return_code),current timestamp,0); --err_log return o_return_code; else set retcode = 0; commit; end if; --log insert into db2inst1.dim_proc_run_log(proc_name,proc_para,step_no,step_desc,step_over_time,step_records) values (vs_proc_name,vi_proc_para,vi_step_no,vs_step_desc,current timestamp,vi_step_records); commit; ----------------------------------------------------------------------------------------------- --儲存過程執行成功 ----------------------------------------------------------------------------------------------- set vi_step_no = 999; set vs_step_desc = '儲存過程執行結束!'; --log insert into db2inst1.dim_proc_run_log(proc_name,proc_para,step_no,step_desc,step_over_time,step_records) values (vs_proc_name,vi_proc_para,vi_step_no,vs_step_desc,current timestamp,0); commit ; set o_return_code = 0 ; set o_return_msg = '儲存過程'||vs_proc_name||'執行成功!'; end [email protected]

三、編譯命令(proc_test_proc.sql為例):

對檔案賦權:

chmod 777 proc_test_proc.sql

編譯:

db2 -[email protected] -vf proc_test_proc.sql

四、儲存過程執行:

db2 "call db2inst1.proc_test_proc('$input',?,?)"  --$input為日期引數

執行成功結果舉例:

  輸出引數的值
  --------------------------
  引數名: O_RETURN_CODE
  引數值: 0

  引數名: O_RETURN_MSG
  引數值: 儲存過程db2inst1.proc_test_proc執行成功!

  返回狀態 = 0