仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 726|回复: 8
打印 上一主题 下一主题

[学习教程] MSSQL教程之PL/SQL中的几种非常处置办法

[复制链接]
简单生活 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:28:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
对于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事务,支持行级锁定
蒙在股里 该用户已被删除
沙发
发表于 2015-1-19 13:42:15 | 只看该作者
可能有的朋友会抱怨集成的orderby,其实如果使用ranking函数,Orderby是少不了的。如果担心Orderby会影响效率,可以为orderby的字段建立聚集索引,查询计划会忽略orderby操作(因为本来就是排序的嘛)。
莫相离 该用户已被删除
板凳
发表于 2015-1-25 21:45:37 | 只看该作者
比如日志传送、比如集群。。。
只想知道 该用户已被删除
地板
发表于 2015-2-4 06:09:36 | 只看该作者
呵呵,这就是偶想说的
admin 该用户已被删除
5#
发表于 2015-2-9 17:09:29 | 只看该作者
微软对CLR作了大篇幅的宣传,这是因为数据库产品终于融入.net体系中。最开始我们也是狂喜,感觉对象数据库的一些概念可以实现了。
爱飞 该用户已被删除
6#
发表于 2015-2-27 12:22:59 | 只看该作者
如果是将来做数据库的开发设计,就应该详细学习T-SQL的各种细节,包括T-SQL的程序设计、存储过程、触发器以及具体使用某个开发语言来访问数据库。
精灵巫婆 该用户已被删除
7#
发表于 2015-3-9 03:41:48 | 只看该作者
一个是把SQL语句写到客户端,可以使用DataSet进行加工;
金色的骷髅 该用户已被删除
8#
发表于 2015-3-16 20:19:23 | 只看该作者
Mirror可以算是SQLServer的Dataguard了。但是能不能被大伙用起来就不知道了。
谁可相欹 该用户已被删除
9#
发表于 2015-3-23 00:53:59 | 只看该作者
SQL语言是学习所有数据库产品的基础,无论你是做数据库管理还是做数据库开发都是这样。不过具体学习的侧重点要看你将来做哪一块,如果是做数据库管理(DBA),侧重点应该放在SQLServer的系统管理上.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 23:10

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表