我看到很多人要sql的存儲過程的例子,所以我就把我以前寫的發(fā)出來,和大家一起探討!
下面是我在蘇州的時候寫的代碼,,是把oracle上的移植過來的,如果大家要oracle的代碼,可以告訴我一聲,我發(fā)
這段代碼很全,有出錯處理,游標動態(tài)定義,聯(lián)合體用戶的使用,分支和循環(huán)語句都有,,
到 /sqllib/下面去找,很多例子的代碼的
我獻丑了!!!
CREATE PROCEDURE IPD.st_inter_PROF ( IN in_Transfer_id dec(6,0), IN in_TRANS_TYPE_id dec(2,0), IN in_begin_date timestamp, IN in_TRANSFER_name varchar(1024), OUT o_err_no int, OUT o_err_msg varchar(1024) ) LANGUAGE SQL ------------------------------------------------------------------------ -- SQL 存儲過程 ------------------------------------------------------------------ -- -- -- -- -- 抽取acct_item_billingday,acct_item表 -- -- author :zsk 2002/06/27 -- -- update by zsk at 2002/11/25 as SZ -- -- move from oracle to db2 by dengl 2002-12-8 as sz -- -- 返回值結果:0:執(zhí)行通過 -- -- 1:執(zhí)行不通過 -- -- -1:調用本過程時異常出錯 -- -- 聯(lián)合體用戶是 ADMINISTRATOR BILL.BILL.* /BILL.CAL.* -- ------------------------------------------------------------------- ------------------------------------------------------------------------ P1: BEGIN --臨時變量出錯變量 declare rec integer default 0; declare SQLCODE integer default 0; declare stmt varchar(1024); declare at_end integer default 0; declare r_code integer default 0; declare state varchar(1024) default 'AAA';--記錄程序當前所作工作 declare temp_int integer default 0; --聲明變量 declare v_cycle_str varchar(1000); declare v_sql_str varchar(2000); declare n_num bigint; declare n_rows bigint; declare n_rows_all bigint;
--聲明放游標的值 --聲明動態(tài)游標存儲變量 declare c_bill_task_id integer; declare bill_task cursor for s1;
--聲明出錯處理 DECLARE EXIT HANDLER FOR SQLEXCEPTION begin set r_code=SQLCODE; set o_err_no=1; set o_err_msg='處理'||state||'出錯 '||'錯誤代碼SQLCODE:'||CHAR(r_code); end; DECLARE continue HANDLER for not found begin SET at_end = 1; set o_err_no=100; end;
--開始拉 select deal_cycle into v_cycle_str from ipd.transfer_task where transfer_id=in_transfer_Id; --v_cycle_str:='%'||v_cycle_str;
if in_trans_type_id=7 then set n_num=1;
---將匯總數(shù)據寫入任務表
update ipd.transfer_task set rows_cnt=0 where transfer_id=in_transfer_id; --聲明動態(tài)游標 set stmt=' select distinct bill_task_id from ADMINISTRATOR.bill_task_cycle a , ADMINISTRATOR.billing_cycle b where substr(char(b.CYCLE_BEGIN_DATE),1,4)||substr(char(b.CYCLE_BEGIN_DATE),6,2)='||char((integer(v_cycle_str)-1))||' and a.billing_cycle_id=b.billing_cycle_id'; prepare s1 from stmt; -- execute s1; open bill_task; --using v_cycle_str; --聲明完畢 fetch_loop1: loop fetch bill_task into c_bill_task_id ; --由于db2和oracle的不同,db2必須先創(chuàng)建一個oracle相連的別名ADMINISTRATOR.*,而不像oracle直接用@to_jif 下面是oracl的源碼 -- v_sql_str:=' update transfer_task -- set rows_cnt=rows_cnt+(select count(*) -- from cal.acct_item_billingday_'||rec.bill_task_id||'@to_jf) -- where transfer_id='||in_transfer_id; --update by dengl 2002-12-08 set stmt='create nickname ADMINISTRATOR.ACCT_ITEM_BILLINGDAY_'||char(c_bill_task_id)||' for bill.cal.acct_item_billingday_'||char(c_bill_task_id); --記錄 set state='創(chuàng)建別名'||'ADMINISTRATOR.ACCT_ITEM_BILLINGDAY_'||char(c_bill_task_id); call ipd.sp_exec_dsql(stmt,o_err_no); --o_err_no 是返回的SQLCODE if o_err_no<>0 then update ipd.transfer_task set deal_flag=-1 where transfer_id=in_transfer_id; set o_err_msg='處理'||state||'出錯 '||'錯誤代碼SQLCODE:'||CHAR(o_err_no); set o_err_no=1; return 0; end if; set v_sql_str=' update ipd.transfer_task set rows_cnt=rows_cnt+(select count(*) from '||'ADMINISTRATOR.ACCT_ITEM_BILLINGDAY_'||char(c_bill_task_id)||' where transfer_id='||char(in_transfer_id); call ipd.sp_exec_dsql(v_sql_str,o_err_no); if o_err_no <> 0 then update ipd.transfer_task set deal_flag=-1 where transfer_id=in_transfer_id; set o_err_msg=char(in_TRANS_TYPE_id)||'傳送出錯!SQLCODE:'||char(o_err_no); set o_err_no=1; return 0; end if ; commit; end loop fetch_loop1; close bill_task; --匯總數(shù)據寫入完畢
--建立接口表并插入數(shù)據
---整理表空間。 call ipd.bi_settle_tablespace(in_Transfer_id, o_err_no, o_err_msg);--調用此過程,檢測表空間 --返回值不為0,則不執(zhí)行返回 set state='整理表空間'; if o_err_no<>0 then update ipd.TRANSFER_TASK set DEAL_FLAG=-1 where Transfer_id=in_Transfer_id; commit; set o_err_msg='處理'||state||'出錯 '||'錯誤代碼SQLCODE:'||CHAR(o_err_no); set o_err_no=1; return 0; end if;
--創(chuàng)建任務需要的接口表 并把多個表的數(shù)據整合到一個表中去,如果是oracle就要使用零時表而db2用別名就代替了 set stmt='create table ipd.'||in_TRANSFER_name; call ipd.sp_exec_dsql(stmt,o_err_no); set state='創(chuàng)建接口表ipd.'||in_TRANSFER_name; if o_err_no<>0 then update ipd.TRANSFER_TASK set DEAL_FLAG=-1 where Transfer_id=in_Transfer_id; commit; set o_err_msg='處理'||state||'出錯 '||'錯誤代碼SQLCODE:'||CHAR(o_err_no); set o_err_no=1; return 0; end if; --建表完畢開始組合sql語句
open bill_task using v_cycle_str; fetch_loop2: loop fetch bill_task into c_bill_task_id; if n_num=1 then set v_sql_str='inter into ipd.'||in_TRANSFER_name||' select * from ACCT_ITEM_BILLINGDAY_'||char(c_bill_task_id); else set v_sql_str=v_sql_str||' union select * from ADMINISTRATOR.ACCT_ITEM_BILLINGDAY_'||char(c_bill_task_id); end if; set n_num=n_num+1; end loop fetch_loop2; --組合完畢 -- set v_sql_str:=v_sql_str||' )'; set state='向接口表ipd.'||in_TRANSFER_name||'插入數(shù)據'; call ipd.sp_exec_dsql(v_sql_str,o_err_no); if o_err_no<>0 then update ipd.TRANSFER_TASK set DEAL_FLAG=-1 where Transfer_id=in_Transfer_id; commit; set o_err_msg='處理'||state||'出錯 '||'錯誤代碼SQLCODE:'||CHAR(o_err_no); set o_err_no=1; return 0; else update transfer_task set deal_flag=2 where transfer_id=in_transfer_id; set o_err_no=0; set o_err_msg=o_err_msg||'任務號為'||char(in_TRANSFER_id)||'抽取成功!'; end if; commit; --數(shù)據插入完畢
--刪除聯(lián)合體的別名 open bill_task using v_cycle_str; fetch_loop3: loop set stmt='drop nickname ADMINISTRATOR.ACCT_ITEM_BILLINGDAY_'||char(c_bill_task_id)||' for bill.cal.acct_item_billingday_'||char(c_bill_task_id); --記錄 set state='刪除別名'||'ADMINISTRATOR.ACCT_ITEM_BILLINGDAY_'||char(c_bill_task_id); call ipd.sp_exec_dsql(stmt,o_err_no); --o_err_no 是返回的SQLCODE if o_err_no<>0 then update ipd.transfer_task set deal_flag=-1 where transfer_id=in_transfer_id; set o_err_msg='處理'||state||'出錯 '||'錯誤代碼SQLCODE:'||CHAR(o_err_no); set o_err_no=1; return 0; end if; end loop fetch_loop3;
-----下賬數(shù)據接口 else if in_trans_type_id =8 then --帳務表的聯(lián)合體別名已經建好了
set v_sql_str='update ipd.transfer_task set rows_cnt=(select count(*) from ADMINISTRATOR.acct_item a , ADMINISTRATOR.billing_cycle b where a.billing_cycle_id=b.billing_cycle_id and substr(char(b.CYCLE_BEGIN_DATE),1,4)||substr(char(b.CYCLE_BEGIN_DATE),6,2)= '''||upper(char(v_cycle_str))||''' ) where Transfer_id='||char(in_Transfer_id); set state='匯總acct_item數(shù)據 '; call ipd.sp_exec_dsql(v_sql_str,o_err_no); if o_err_no <> 0 then update ipd.transfer_task set deal_flag=-1 where transfer_id=in_transfer_id; set o_err_no=1; set o_err_msg=state||char(in_TRANS_TYPE_id)||'傳送出錯!'; return 0; end if; --整理表空間。 call ipd.bi_settle_tablespace(in_Transfer_id, o_err_no, o_err_msg);--調用此過程,檢測表空間 --返回值不為0,則不執(zhí)行返回 set state='為acct_item整理表空間'; if o_err_no<>0 then update ipd.TRANSFER_TASK set DEAL_FLAG=-1 where Transfer_id=in_Transfer_id; set o_err_msg=state||'任務號'||char(in_TRANS_TYPE_id)||'傳送出錯!SQLCODE:'||char(o_err_no); set o_err_no=1; commit; return 0; end if; --在任務表中將狀態(tài)改為1,準備傳送數(shù)據. update ipd.TRANSFER_TASK set DEAL_FLAG=1 where Transfer_id=in_Transfer_id; commit; set v_sql_str='create table ipd.'||in_TRANSFER_name||' like ADMINISTRATOR.ACCT_item)'; call ipd.sp_exec_dsql(v_sql_str,o_err_no); set stmt='inset into ipd.'||in_TRANSFER_name||' select ACCT_ITEM_ID,SERV_ID,SERV_SEQ_NBR,EXT_SERV_ID, ACCT_ID,ACCT_SEQ_NBR,ACCT_ITEM_TYPE_ID,CHARGE,BILLING_CYCLE_ID,CREATED_DATE,PARTNER_ID,BILL_SERIAL_NBR,STATE,STATE_DATE, EXCHANGE_ID, PAYMENT_METHOD from ADMINISTRATOR.acct_item where billing_cycle_id like '''||upper(v_cycle_str)||''''; call ipd.sp_exec_dsql(stmt,o_err_no); set state='插入數(shù)據到ipd.'||in_TRANSFER_name; if o_err_no = 0 then update transfer_task set deal_flag=2 where transfer_id=in_transfer_id; set o_err_no=0; else update transfer_task set deal_flag=-1 where transfer_id=in_transfer_id; set o_err_msg=state||'任務號'||char(in_TRANS_TYPE_id)||'傳送出錯!SQLCODE:'||char(o_err_no); set o_err_no=1; end if ; commit; end if;--下帳數(shù)據完畢 end if; set temp_int=0; call ipd.bi_check(in_transfer_id, in_transfer_name, temp_int, o_err_no, o_err_msg); END P1 |