• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            DB2 存儲過程例子

            Posted on 2010-05-09 18:33 Prayer 閱讀(487) 評論(0)  編輯 收藏 引用 所屬分類: DB2

            再轉一個例子

            我看到很多人要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
            97热久久免费频精品99| 激情综合色综合久久综合| 亚洲精品乱码久久久久久蜜桃| 久久天天躁狠狠躁夜夜av浪潮| 久久综合视频网| 亚洲综合日韩久久成人AV| 久久精品国产第一区二区三区| 国产69精品久久久久777| 久久99精品久久久久久不卡 | 精品国产91久久久久久久a | 秋霞久久国产精品电影院| 久久综合伊人77777麻豆| 久久午夜伦鲁片免费无码| 国内精品久久久久久不卡影院| 精品国产乱码久久久久软件| 欧美日韩中文字幕久久伊人| 99精品国产综合久久久久五月天 | 久久精品卫校国产小美女| 久久精品一区二区国产| 国产亚洲精久久久久久无码77777| 精品一区二区久久| 99精品国产综合久久久久五月天| 国产免费福利体检区久久| 欧美喷潮久久久XXXXx| 一极黄色视频久久网站| 狠狠精品干练久久久无码中文字幕| 伊人久久大香线蕉综合影院首页| 久久影视国产亚洲| 久久996热精品xxxx| 国产精品成人久久久久三级午夜电影 | 久久久久久午夜精品| 久久99精品国产99久久6| 四虎国产精品免费久久久| 国产精品99久久久精品无码| 久久毛片一区二区| 99蜜桃臀久久久欧美精品网站 | 一极黄色视频久久网站| 狠狠色丁香婷婷综合久久来来去| 久久r热这里有精品视频| 久久午夜电影网| 岛国搬运www久久|