近期編寫tcbs儲存過程小記(1)
/**************************************************************************/
/*******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各類業務情形,有針對性的編寫各類異常處理程式碼,不可多寫也絕不能少寫,不會前端業務在執行會出現無法預知的情況
深深的理解到程式碼的健壯性問題是非常重要的
在編寫程式碼前,一定要靜下心來,全方位分析思考你要實現什麼功能,然後是如何實現此功能.實現此功能後,如何確認此功能是符合客戶所需要,如何科學的測試.
/*******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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle儲存過程-1Oracle儲存過程
- oracle儲存過程書寫格式Oracle儲存過程
- Q&A:在SQL Server 2005中編寫儲存過程RVSQLServer儲存過程
- MySQL的寫入資料儲存過程MySql儲存過程
- Oracle儲存過程乾貨(一):儲存過程基礎Oracle儲存過程
- SQL 儲存過程裡呼叫另一個儲存過程SQL儲存過程
- 儲存過程與儲存函式儲存過程儲存函式
- SQLSERVER儲存過程SQLServer儲存過程
- 呼叫儲存過程儲存過程
- mysql 儲存過程MySql儲存過程
- unidac儲存過程儲存過程
- firedac儲存過程儲存過程
- Oracle儲存過程Oracle儲存過程
- Oracle 編譯儲存過程卡死解決方法Oracle編譯儲存過程
- Oracle儲存過程編譯卡死的解決方法Oracle儲存過程編譯
- Oracle儲存過程中跳出迴圈的寫法Oracle儲存過程
- JdbcTemplate調儲存過程JDBC儲存過程
- 造數儲存過程儲存過程
- 儲存過程——遊標儲存過程
- 儲存過程 傳 datatable儲存過程
- JAVA儲存過程(轉)Java儲存過程
- MySQL之儲存過程MySql儲存過程
- oracle的儲存過程Oracle儲存過程
- MySQL---------儲存過程MySql儲存過程
- linux呼叫儲存過程Linux儲存過程
- Winform呼叫儲存過程ORM儲存過程
- mysql儲存過程整理MySql儲存過程
- oracle儲存過程許可權繼承小結Oracle儲存過程繼承
- 索引儲存小記索引
- Sql儲存過程分頁--臨時表儲存SQL儲存過程
- mongo 儲存過程詳解Go儲存過程
- Sqlserver中的儲存過程SQLServer儲存過程
- SQL 分頁儲存過程SQL儲存過程
- 原創:oracle 儲存過程Oracle儲存過程
- jsp中呼叫儲存過程JS儲存過程
- 資料庫儲存過程資料庫儲存過程
- mybatis儲存過程返回listMyBatis儲存過程
- Mysql 儲存過程的使用MySql儲存過程
- mysql如何呼叫儲存過程MySql儲存過程