数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

PL/SQL中的几种异常处理方法的源代码


发布日期:2019年10月05日
 
PL/SQL中的几种异常处理方法的源代码

用Fetch into a cursor%TYPE把要处理的数据放到记录集里当一条数据不符条件时用标签<<NEXT_RECORD>>和GOTO NEXT_RECORD

Function Name :CalculateImportCharge

Function Desc :Calculate Import Charge

Created by:Author

Created Date:

FUNCTION CalculateImportCharge (

p_i_job_idIN VARCHAR

p_i_as_of_date_id IN VARCHAR) RETURN NUMBER

AS

CURSOR cur_ShipBlHeader IS

SELECT import_folder_no

FROM GMY_SHIP_BL_HEADER

WHERE CANCEL_FLG = GMY_GA_PKGBL_CANCEL_FLG_OFF;

rec_ShipBlHeadercur_ShipBlHeader%ROWTYPE;

BEGIN

OPEN cur_ShipBlHeader;

FETCH cur_ShipBlHeader INTO rec_ShipBlHeader;

WHILE cur_ShipBlHeader%FOUND LOOP

x_num_error_code := GMY_GA_PKGCheckValidMasterBlNo (

p_i_job_id

p_i_as_of_date_id

rec_ShipBlHeaderimport_folder_no

x_vch_message);

IF x_num_error_code

IN (GMY_GA_PKGgn#NG GMY_GA_PKGINVALID_BL_NO) THEN

x_vch_message :=

p_i_job_id

|| WARNING: Function CheckValidMasterBlNo @

|| Import folder

|| rec_ShipBlHeaderimport_folder_no

|| Invalid BL No;

COM_LOGPUTLINE (p_i_job_id x_vch_message);

GOTO NEXT_RECORD;

END IF;

x_num_error_code := CheckExistsOfAccDate (

p_i_job_id

p_i_as_of_date_id

rec_ShipBlHeaderimport_folder_no);

IF x_num_error_code = GMY_GA_PKGgn#NG THEN

GOTO NEXT_RECORD;

END IF;

COMMIT;

<<NEXT_RECORD>>

FETCH cur_ShipBlHeader INTO rec_ShipBlHeader;

END LOOP;

CLOSE cur_ShipBlHeader;

RETURN GMY_GA_PKGgn#OK;

EXCEPTION

WHEN OTHERS THEN

x_vch_message :=

p_i_job_id

|| ERROR: Function CalculateImportCharge @

|| SUBSTR (SQLERRM (SQLCODE) );

COM_LOGPUTLINE (p_i_job_id x_vch_message);

RETURN GMY_GA_PKGgn#NG;

END CalculateImportCharge;

当使用the Cursor FOR Loop循环时在Loop循环里把会出问题的情况写进一个独立的block块中这个块包括完整的beginend部分及exception异常处理部分这样即使一条数据出现异常也会继续执行下一条

Function Name : GenerateInsCostInfRec

Function Desc : Generate records to transmit in INF table

Created by: SISS(AP)

Created Date:

FUNCTION GenerateInsCostInfRec (

p_i_job_id IN VARCHAR

p_i_as_of_date_idIN VARCHAR) RETURN NUMBER

AS

CURSOR cur_cost IS

SELECT costROWID costRowId

costimport_folder_no

costinsur_trans_id

FROM GMY_COST_BL cost

GMY_COMMON_MST mst

WHERE costimport_folder_no=invheaderimport_folder_no

AND costbilling_amt_num IS NOT NULL

AND costbilling_amt_num!=

AND costinsur_db_cr!=;

BEGIN

FOR rec_cost IN cur_cost LOOP

BEGIN

x_num_ret_value := GMY_GA_PKGCheckValidMasterBlNo(

p_i_job_id

p_i_as_of_date_id

rec_costimport_folder_no

x_vch_error_msg);

IF x_num_ret_value = GMY_GA_PKGVALID_BL_NO THEN

INSERT INTO GMY_COST_INS_INF(

cost_trx_id

created_by

program_name)

VALUES(

GMY_COST_INS_INF_SNEXTVAL

PRG_NAME

PRG_NAME);

ELSIF x_num_ret_value = GMY_GA_PKGINVALID_BL_NO THEN

x_vch_error_msg := p_i_job_id

|| Import folder

|| rec_costimport_folder_no

|| has repeated BL No with other import folder

|| Failed in insurance cost transmission;

COM_LOGPUTLINE(p_i_job_id x_vch_error_msg);

END IF;

EXCEPTION

WHEN OTHERS THEN

IF SQL%ROWCOUNT > THEN check for too many rows

x_vch_error_msg := p_i_job_id|| ||

SUBSTR(SQLERRM(SQLCODE));

COM_LOGPUTLINE(p_i_job_id x_vch_error_msg);

ELSE

x_vch_error_msg := p_i_job_id|| ||

SUBSTR(SQLERRM(SQLCODE));

COM_LOGPUTLINE(p_i_job_id x_vch_error_msg);

END IF;

END;

END LOOP;

COMMIT;

RETURN GMY_GA_PKGgn#OK;

EXCEPTION

WHEN OTHERS THEN

x_vch_error_msg := p_i_job_id|| ||SUBSTR(SQLERRM(SQLCODE));

COM_LOGPUTLINE(p_i_job_id x_vch_error_msg);

ROLLBACK;

RETURN GMY_GA_PKGgn#NG;

END GenerateInsCostInfRec;

当使用the Cursor FOR Loop循环时在Loop循环里把会出问题的情况拆分成子函数分别处理

Function Name:CopyDsToActualDs

Function Desc:Copy the records from DS DB to Actual DS DB

Created by :Author

Created Date :

FUNCTION CopyDsToActualDs (

p_i_job_id IN VARCHAR

p_i_as_of_date_idIN VARCHAR)RETURN NUMBER

IS

CURSOR cur_DsScc IS

SELECT *

FROM GMY_DS_SCC;

BEGIN

FOR rec_DsHead IN cur_DsScc LOOP

x_num_error_code := InsToActualScc(

上一篇:Oracle建立DBLINK的详细步骤记录

下一篇:Oracle9i的全文检索技术