DB2儲存過程模板(儲存過程舉例、編譯、執行)
阿新 • • 發佈:2021-01-19
一、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