MSSQL教程之PL/SQL中的几种非常处置办法
对于insert和delete,event中包含了插入/删除的记录的所有字段的值(太爽了。。)非常处置这是Pona的文章,我大胆将其贴下去,Pona不要介怀哦!^_^
PL/SQL里,有三种办法能够在处置多量量数据时不会由于一条或几条数据毛病而招致非常中断程序。
1、用Fetchintoacursor%TYPE把要处置的数据放到纪录集里。当一条数据不符前提时,用标签<<NEXT_RECORD>>和GOTONEXT_RECORD跳转语句使程序疏忽这一条,转到下一条持续处置。
-------------------------------------------------------------------------------
--FunctionName:CalculateImportCharge
--FunctionDesc:CalculateImportCharge
--Createdby:Author
--CreatedDate:2003-05-16
-------------------------------------------------------------------------------
FUNCTIONCalculateImportCharge(
p_i_job_idINVARCHAR2,
p_i_as_of_date_idINVARCHAR2)RETURNNUMBER
AS
CURSORcur_ShipBlHeaderIS
SELECTimport_folder_no
FROMGMY_SHIP_BL_HEADER
WHERECANCEL_FLG=GMY_GA000_PKG.BL_CANCEL_FLG_OFF;
rec_ShipBlHeadercur_ShipBlHeader%ROWTYPE;
BEGIN
OPENcur_ShipBlHeader;
FETCHcur_ShipBlHeaderINTOrec_ShipBlHeader;
WHILEcur_ShipBlHeader%FOUNDLOOP
x_num_error_code:=GMY_GA000_PKG.CheckValidMasterBlNo(
p_i_job_id,
p_i_as_of_date_id,
rec_ShipBlHeader.import_folder_no,
x_vch_message);
IFx_num_error_code
IN(GMY_GA000_PKG.gn#NG,GMY_GA000_PKG.INVALID_BL_NO)THEN
x_vch_message:=
p_i_job_id
||WARNING:FunctionCheckValidMasterBlNo@
||Importfolder
||rec_ShipBlHeader.import_folder_no
||-InvalidBLNo.;
COM_LOG.PUTLINE(p_i_job_id,x_vch_message);
GOTONEXT_RECORD;
ENDIF;
x_num_error_code:=CheckExistsOfAccDate(
p_i_job_id,
p_i_as_of_date_id,
rec_ShipBlHeader.import_folder_no);
IFx_num_error_code=GMY_GA000_PKG.gn#NGTHEN
GOTONEXT_RECORD;
ENDIF;
COMMIT;
<<NEXT_RECORD>>
FETCHcur_ShipBlHeaderINTOrec_ShipBlHeader;
ENDLOOP;
CLOSEcur_ShipBlHeader;
RETURNGMY_GA000_PKG.gn#OK;
EXCEPTION
WHENOTHERSTHEN
x_vch_message:=
p_i_job_id
||ERROR:FunctionCalculateImportCharge@
||SUBSTR(SQLERRM(SQLCODE),1,100);
COM_LOG.PUTLINE(p_i_job_id,x_vch_message);
RETURNGMY_GA000_PKG.gn#NG;
ENDCalculateImportCharge;
2、当利用theCursorFORLoop轮回时,在Loop轮回里,把会出成绩的情形写进一个自力的block块中,这个块包含完全的begin、end部分及exception非常处置部分。如许即便一条数据呈现非常,也会持续实行下一条。
-------------------------------------------------------------------------------
--FunctionName:GenerateInsCostInfRec
--FunctionDesc:GeneraterecordstotransmitinINFtable
--Createdby:SISS(AP)
--CreatedDate:2003-03-26
------------------------------------------------------------------------------
FUNCTIONGenerateInsCostInfRec(
p_i_job_idINVARCHAR2,
p_i_as_of_date_idINVARCHAR2)RETURNNUMBER
AS
CURSORcur_costIS
SELECTcost.ROWIDcostRowId,
cost.import_folder_no,,
cost.insur_trans_id
FROMGMY_COST_BLcost,
GMY_COMMON_MSTmst
WHEREcost.import_folder_no=invheader.import_folder_no
ANDcost.billing_amt_numISNOTNULL
ANDcost.billing_amt_num!=0
ANDcost.insur_db_cr!=0;
BEGIN
FORrec_costINcur_costLOOP
BEGIN
x_num_ret_value:=GMY_GA000_PKG.CheckValidMasterBlNo(
p_i_job_id,
p_i_as_of_date_id,
rec_cost.import_folder_no,
x_vch_error_msg);
IFx_num_ret_value=GMY_GA000_PKG.VALID_BL_NOTHEN
INSERTINTOGMY_COST_INS_INF(
cost_trx_id,,
created_by,
program_name)
VALUES(
GMY_COST_INS_INF_S.NEXTVAL,
PRG_NAME,
PRG_NAME);
ELSIFx_num_ret_value=GMY_GA000_PKG.INVALID_BL_NOTHEN
x_vch_error_msg:=p_i_job_id
||Importfolder
||rec_cost.import_folder_no
||hasrepeatedBLNo.withotherimportfolder.
||Failedininsurancecosttransmission.;
COM_LOG.PUTLINE(p_i_job_id,x_vch_error_msg);
ENDIF;
EXCEPTION
WHENOTHERSTHEN
IFSQL%ROWCOUNT>0THEN--checkfortoomanyrows
x_vch_error_msg:=p_i_job_id||||
SUBSTR(SQLERRM(SQLCODE),1,100);
COM_LOG.PUTLINE(p_i_job_id,x_vch_error_msg);
ELSE
x_vch_error_msg:=p_i_job_id||||
SUBSTR(SQLERRM(SQLCODE),1,100);
COM_LOG.PUTLINE(p_i_job_id,x_vch_error_msg);
ENDIF;
END;
ENDLOOP;
COMMIT;
RETURNGMY_GA000_PKG.gn#OK;
EXCEPTION
WHENOTHERSTHEN
x_vch_error_msg:=p_i_job_id||||SUBSTR(SQLERRM(SQLCODE),1,100);
COM_LOG.PUTLINE(p_i_job_id,x_vch_error_msg);
ROLLBACK;
RETURNGMY_GA000_PKG.gn#NG;
ENDGenerateInsCostInfRec;
3、当利用theCursorFORLoop轮回时,在Loop轮回里,把会出成绩的情形拆分红子函数,分离处置。
----------------------------------------------------------------------------
--FunctionName:CopyDsToActualDs
--FunctionDesc:CopytherecordsfromDSDBtoActualDSDB.
--Createdby:Author
--CreatedDate:2003-02-20
----------------------------------------------------------------------------
FUNCTIONCopyDsToActualDs(
p_i_job_idINVARCHAR2,
p_i_as_of_date_idINVARCHAR2)RETURNNUMBER
IS
CURSORcur_DsSccIS
SELECT*
FROMGMY_DS_SCC;
BEGIN
FORrec_DsHeadINcur_DsSccLOOP
x_num_error_code:=InsToActualScc(
p_i_job_id,
p_i_as_of_date_id,
rec_DsHead.order_by_code,
rec_DsHead.po_code,
rec_DsHead.wh);
ENDLOOP;
EXCEPTION
WHENOTHERSTHEN
x_vch_error_msg:=p_i_job_id
||FunctionName:CopyDsToActualDs;
COM_LOG.PUTLINE(p_i_job_id,x_vch_error_msg);
x_vch_error_msg:=p_i_job_id||||SUBSTR(SQLERRM(SQLCODE),1,100);
COM_LOG.PUTLINE(p_i_job_id,x_vch_error_msg);
ROLLBACK;
RETURNGMY_GA000_PKG.gn#NG;
ENDCopyDsToActualDs;
----------------------------------------------------------------------------
--FunctionName:InsToActualScc
--FunctionDesc:Dealwithinsertsection.
--Createdby:Author
--CreatedDate:2003-03-13
----------------------------------------------------------------------------
FUNCTIONInsToActualScc(
p_i_job_idINVARCHAR2,
p_i_as_of_date_idINVARCHAR2,
p_i_order_by_codeINVARCHAR2,
p_i_po_codeINVARCHAR2,
p_i_whINVARCHAR2
)RETURNNUMBER
IS
x_vch_error_msgVARCHAR2(255);
BEGIN
INSERTINTOGMY_ACTUAL_DS_SCC(
order_by_code,
po_code,
wh)
VALUES(p_i_order_by_code,
p_i_po_code,
p_i_wh);
COMMIT;
RETURNGMY_GA000_PKG.gn#OK;
EXCEPTION
WHENOTHERSTHEN
x_vch_error_msg:=p_i_job_id||FunctionName:InsToActualScc;
COM_LOG.PUTLINE(p_i_job_id,x_vch_error_msg);
x_vch_error_msg:=p_i_job_id
||Thekeyoftherecordthatfailedtoinsertis:;
COM_LOG.PUTLINE(p_i_job_id,x_vch_error_msg);
ROLLBACK;
RETURNGMY_GA000_PKG.gn#NG;
ENDInsToActualScc;
InnoDB事务型数据库的首选引擎,支持ACID事务,支持行级锁定 可能有的朋友会抱怨集成的orderby,其实如果使用ranking函数,Orderby是少不了的。如果担心Orderby会影响效率,可以为orderby的字段建立聚集索引,查询计划会忽略orderby操作(因为本来就是排序的嘛)。 比如日志传送、比如集群。。。 呵呵,这就是偶想说的 微软对CLR作了大篇幅的宣传,这是因为数据库产品终于融入.net体系中。最开始我们也是狂喜,感觉对象数据库的一些概念可以实现了。 如果是将来做数据库的开发设计,就应该详细学习T-SQL的各种细节,包括T-SQL的程序设计、存储过程、触发器以及具体使用某个开发语言来访问数据库。 一个是把SQL语句写到客户端,可以使用DataSet进行加工; Mirror可以算是SQLServer的Dataguard了。但是能不能被大伙用起来就不知道了。 SQL语言是学习所有数据库产品的基础,无论你是做数据库管理还是做数据库开发都是这样。不过具体学习的侧重点要看你将来做哪一块,如果是做数据库管理(DBA),侧重点应该放在SQLServer的系统管理上.
页:
[1]