近期編寫tcbs儲存過程小記(1)

wisdomone1發表於2011-09-08
/**************************************************************************/
/*******20110829zxy 新增儲存過程 proc_ADJUSTSUBMAMT************************/
/*******20110829zxy 呼叫儲存過程 call proc_submavailfunds 儲存過程*********/
/**************************************************************************/
procedure proc_ADJUSTSUBMAMT(in_DEDUCTSCHEDNBR in deductschedsubm.deductschednbr%type,
                             in_submnbr in deductschedsubm.submnbr%type,
                             in_debugyn in char,
                             out_errornbr out integer,
                             out_errormsg out varchar2,
                             out_oraerrormsg out varchar2)
as
/**************************************************************************************/
/*********************PROCEDURE NAME: proc_ADJUSTSUBMAMT    **************************/
/*********************DESCRIPTION:調整某個代發協議下須調整批次號的批次內調整金額*******/
/*********************            與其它非調整批次號的批次內調整金額       ************/
/*********************CALLED FROM: 前臺介面             *******************************/
/*********************MODIFICATION HISTORY:zxy          *******************************/
/**************************************************************************************/


/************************************************************************************/
/*****            GENERAL ERROR PROCESSING VARIABLES                            *****/
/************************************************************************************/
OSI_GENERAL_ERROR                          EXCEPTION;--osi通用異常





/************************************************************************************/
/*****            PROCEDURE VARIABLES                                           *****/
/************************************************************************************/
cursor cur_deductsubm
is
Select DEDUCTSCHEDNBR,submnbr
from DEDUCTSCHEDSUBM
where DEDUCTSCHEDNBR= in_DEDUCTSCHEDNBR;
lvndeductschednbr deductschedsubm.deductschednbr%type;
lvnsubmnbr deductschedsubm.submnbr%type;  

lvnUserPersNbr                        INTEGER;

lvsActvMsg                                 VARCHAR2(100);--20110829 zxy
lvsdeductschednbr deductschedsubm.deductschednbr%type;
lvssubmnbr deductschedsubm.submnbr%type;

lcsdebugproccd   constant varchar2(4):='AJSM';--跟蹤標識
---下述為被呼叫儲存過程PROC_SUBMAVAILFUNDS的輸出引數
out_SUBMDEPAMT  NUMBER;                                  --批次總存款額
out_SUBMPAYROLLAMT  NUMBER;                           --批次的已佔用餘額
out_SUBMBALAMT  NUMBER;                                  --批次的可用餘額
out_SUBMWTHAMT  NUMBER;                                  --批次已代發的金額
out_DEDUCTBALAMT  NUMBER;                                --計劃號下的可用餘額

lvsDEDUCTBALAMT number;
lvsSUBMBALAMT  number;
lvsoraclemsg   VARCHAR2(100);
lvsdebugyn     char;





begin


lvsdebugyn:=in_debugyn;

lvsActvMsg:='開始執行儲存過程proc_adjustsubmamt';

if (lvsdebugyn='Y') then
  insert into sp_debug(seqnbr,debugdate,debugtime,procname,debugtext)
  values(sp_debugseqnbr.nextval,sysdate,to_char(sysdate,'hh24:mi:ss'),
         'proc_ADJUSTSUBMAMT','procedure;lvsactvmsg: '||lvsActvMsg);
end if;

lvsActvMsg:='開啟遊標cur_deductsubm開始迴圈提取協議號和批次號';
open  cur_deductsubm;
loop
   fetch cur_deductsubm into lvnDeductSchedNbr,lvnsubmnbr;
   exit when cur_deductsubm%notfound;
        lvsActvMsg:='提取鎖定的批發協議和批次記錄';
        begin
          select DEDUCTSCHEDNBR, SUBMNBR
          into   lvsDEDUCTSCHEDNBR, lvsSUBMNBR
          from DEDUCTSCHEDSUBM
          where DEDUCTSCHEDNBR= lvnDeductSchedNbr
                and submnbr=lvnsubmnbr
          for update nowait;
        exception
          when others then
          raise OSI_GENERAL_ERROR;
        end;  
        
       
       
       
        --20110905 zxy 註解
        --lvsActvMsg:='如果是代發協議下的調整批次';
        begin
              if lvssubmnbr=in_submnbr then
             
             
                           --呼叫PROC_SUBMAVAILFUNDS儲存過程
                            PROC_SUBMAVAILFUNDS(lvsDeductSchedNbr,
                                                lvssubmnbr,
                                                lvsdebugyn,
                                                out_SUBMDEPAMT,
                                                out_SUBMPAYROLLAMT,
                                                out_SUBMBALAMT,
                                                out_SUBMWTHAMT,
                                                out_DEDUCTBALAMT,
                                                out_ERRORNBR,
                                                out_ERRORMSG,
                                                out_ORAERRORMSG);
                                               
                                               
                                   --20110906 zxy 暫時註解此程式碼
                            if out_errornbr<>0 then
                              lvsActvMsg:='執行補呼叫儲存過程PROC_SUBMAVAILFUNDS出錯';
                              raise OSI_GENERAL_ERROR;
                            end if;
                           
                            lvsActvMsg:='用儲存過程的引數lvsDEDUCTBALAMT及lvsSUBMBALAMT儲存被呼叫儲存過程的輸出引數資訊';
                            lvsDEDUCTBALAMT:=out_DEDUCTBALAMT;--20110905 zxy 原sql lvsDEDUCTBALAMT:=out_DEDUCTBALAMT;
                            lvsSUBMBALAMT:=out_SUBMBALAMT; --20110905 zxy 原sqllvsSUBMBALAMT:=out_SUBMBALAMT;
                       
                           
                                  
                            update deductschedsubm
                           
                            
                            --20110905 zxy 暫把ADJUSTMENTAMT寫成固定值,對比測試
                            --20110906 zxy comment below line
                           
                            set    adjustmentamt=adjustmentamt +(lvsDEDUCTBALAMT-lvsSUBMBALAMT),
                                   datelastmaint=sysdate
                            where  DEDUCTSCHEDNBR= lvsDeductSchedNbr
                                   and SUBMNBR= lvsSubmNbr;
                            
                           
                                  
                          
                            if (sql%rowcount=0) then
                                 raise OSI_GENERAL_ERROR;
                           
                            end if;
                   
            -- end if;
         --end;
        
         --20110905 zxy 註解
         --lvsActvMsg:='如果是代發協議下其它其它非調整批次';
         --begin
        
                else 
                          --呼叫PROC_SUBMAVAILFUNDS儲存過程
                                PROC_SUBMAVAILFUNDS(lvsDeductSchedNbr,
                                                    lvssubmnbr,
                                                    lvsdebugyn,
                                                    out_SUBMDEPAMT,
                                                    out_SUBMPAYROLLAMT,
                                                    out_SUBMBALAMT,
                                                    out_SUBMWTHAMT,
                                                    out_DEDUCTBALAMT,
                                                    out_ERRORNBR,
                                                    out_ERRORMSG,
                                                    out_ORAERRORMSG);
                                /*if out_errornbr!=0 then
                                   lvsActvMsg:='執行儲存過程PROC_SUBMAVAILFUNDS';
                                   raise OSI_GENERAL_ERROR;
                                end if;*/
                     
                      
                               lvsSUBMBALAMT:=out_SUBMBALAMT;--20110905 zxy 原sql        lvsSUBMBALAMT:=out_SUBMBALAMT           
                     
                     
                     
                               update deductschedsubm
                               --20110905 zxy 暫把ADJUSTMENTAMT寫成固定值,對比測試
                               --20110906 zxy comment below line
                                 --set adjustmentamt=333,
                               set    adjustmentamt=adjustmentamt-lvsSUBMBALAMT,
                                       datelastmaint=sysdate
                               where  DEDUCTSCHEDNBR= lvsDeductSchedNbr
                                      and SUBMNBR= lvsSubmNbr;
                                     
                             
                               if (sql%rowcount=0) then
                                     raise OSI_GENERAL_ERROR;
                              
                               end if;
                end if;             
               
        end;
       
       
        end loop;
       
        close cur_deductsubm;
        out_errornbr:=0;
       
       
        exception
            when OSI_GENERAL_ERROR then
               lvsoraclemsg:=substr(sqlerrm,1,100);
               out_errornbr:=abs(sqlcode);
               out_errormsg:=lvsactvmsg||'_'||lcsdebugproccd;
               out_oraerrormsg:=lvsoraclemsg;
              
               if (in_debugyn='Y') then
                  insert into sp_debug(seqnbr,debugdate,debugtime,persnbr,procname,debugtext)
                  values(sp_debugseqnbr.nextval,sysdate,to_char(sysdate,'hh24:mi:ss'),lvnUserPersNbr,'proc_ADJUSTSUBMAMT',
                  '**procedure failed** '||lvsActvMsg||' *** '||lvsoraclemsg);
               END IF;
              
            when others then
               lvsoraclemsg:=substr(sqlerrm,1,100);
               out_errornbr:=abs(sqlcode);
               out_errormsg:=lvsactvmsg||'_'||lcsdebugproccd;
               out_oraerrormsg:=lvsoraclemsg;
               if (in_debugyn='Y') then
                  insert into sp_debug(seqnbr,debugdate,debugtime,persnbr,procname,debugtext)
                  values(sp_debugseqnbr.nextval,sysdate,to_char(sysdate,'hh24:mi:ss'),lvnUserPersNbr,'proc_ADJUSTSUBMAMT',
                  '**procedure failed** '||lvsActvMsg||' *** '||lvsoraclemsg);
               END IF;


end     proc_ADJUSTSUBMAMT;                        


END PACK_FILELOAD_PAYR;



小結:
   清晰理解前端介面與後端資料庫的輸入及輸出引數的對映關係,通俗點講就是:前端介面的資訊如何與後端oracle儲存過程或者函式及sql語句中的引數的對應關係.前臺如何把資訊傳遞給後端.而後端如何接受前端的資訊.再進一步.後端經加工後的資訊又是如何傳遞給前端.
  儲存過程的名稱命名規則一定要與整體的tcbs的儲存過程相一致.作到見字識人之效
  儲存過程的輸入輸出引數的命名規則也是同理
  儲存過程體中的變數定義規則也是採用tcbs的三大塊命名規範:
     異常變數定義
     過程變數定義
     過程常量定義
     變數字首必須是:lvn,lvs等,不可自造一個,違反整體的規範
  儲存過程中異常的處理一定要有始有終,每作一個select,update,insert,delete必須要透過sp_debug表來記錄操作日誌資訊,便於後期故障分析
  要深入理解tcbs各類業務情形,有針對性的編寫各類異常處理程式碼,不可多寫也絕不能少寫,不會前端業務在執行會出現無法預知的情況
   深深的理解到程式碼的健壯性問題是非常重要的
   在編寫程式碼前,一定要靜下心來,全方位分析思考你要實現什麼功能,然後是如何實現此功能.實現此功能後,如何確認此功能是符合客戶所需要,如何科學的測試.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9240380/viewspace-706900/,如需轉載,請註明出處,否則將追究法律責任。

相關文章