浙江网新恩普软件有限公司内部资料妥善保管第1页共10页1PL/SQL命名规范1.1包命名规范存储过程包名为大写,以“SBP_”为前缀,后跟原则上10个字母以内的英文单词或缩写,特殊情况可扩展到15个字母以内。1.2存储过程命名规范存储过程分为两种,如是Procedure类型的,以“P_”为前缀;如是Funcation类型的,以“F_”为前缀。注意为大写英文字母。名称以英文单词的组合为主,每个单词的首字母为大写。存储过程名称要求具有具体的业务含义,并且应该为动词,表示其进行一定的处理或者逻辑判断。例如:个人帐户结息可以为:P_CalculateAccountInterest为了具有很好的可读性,便于理解,存储过程的参数名称必须具有具体的业务含义,如an_year、an_month、ac_employeeName、ad_deathDate,不允许采用数据库中的指标名称。参数名称首字母小写。假如参数名称为多个单词的组合,则除了第一个单词外,其余单词的首字母大写。1.3变量命名规则*表字段相关变量的定义规则:类型名_字段名类型名:varchar2类型为“v”,number类型为“n”,date类型为“d”……字段名:表中字段的名称。例如:n_aac001,v_aac002*函数、存储过程传入参数的定义规则:“A”+类型名+注释。例如:an_year,ac_employeeName*存储过程近回参数的定义规则:“R”+类型名+注释。例如:rn_accountAmount,rc_message普通变量的定义规则:类型名_注释注释:英文命名,小写字母开头,后面的单词用大写字母开头。浙江网新恩普软件有限公司内部资料妥善保管第2页共10页例如:v_name,n_days*记录类型的定义规则:record_记录注释*记录变量的定义规则:rec_记录注释*类型的定义规则:type_类型注释*类型变量的定义规则:t_类型注释1.4注释编写规范PL/SQL的注释编写,遵循plsqldocPlug-In的文档注释规范。遵循本规范的PL/SQL,可以通过plsqldocPlug-In生成格式化文档。必须编写的注释说明主要有两类,分别是包说明、过程说明。1、包说明在包定义后编写该包的说明,主要说明该包面向的主要业务,以及该包主要包含的业务逻辑。包说明写在包定义后,范例如下:createorreplacepackageDepartmentis--PackagewithfunctionalityrelatedtotheDepttable.--Mostfunctionsrequireap_DeptNoparameter,which--isthevalueoftheDeptNocolumninthe{#linkDept}--table.2、过程说明过程说明主要说明该业务过程主要处理什么业务逻辑,其内部的主要流程的关键处理有哪些。过程说明写在过程前面,范例如下:--Openacursortoselectdepartmentsinaparticularorder.--#paramp_cursorThecursorthatwillbeopenedforall--Deptrecordsinthegivenorder--#paramp_orderTheorderoftheDeptrecords.Validvaluesare:--{*}'DEPTNO'RecordsareorderedbyDeptNo.--{*}'NAME'Recordsareorderedbyname.浙江网新恩普软件有限公司内部资料妥善保管第3页共10页--{*}'LOC'Recordsareorderedbyloc.Thesecondary--sortcolumnisDeptNo.--{*}NULLTheresultsetwillnotbeordered--(default).--#raisese_InvalidOrderRaisedwhenthevalueofp_orderisinvalid.procedureSelectRecords(p_Cursorinoutt_DeptCursor,p_Ordervarchar2defaultnull);其中参数说明的方法是:#param参数名称参数说明对于funcation,则返回值这样说明:#return返回值说明可以采用#authorname和#versiontext标签来表示作者和版本信息{*}表示缩进的项目符号。一下是支持的所有注释标签。TagDescription#paramnametextThedescriptionofafunctionorprocedureparameter.Subsequent#paramtagswillbeplacedinonetable.#returntextAdescriptionofthereturnvalueofafunction.#valuenametextApossiblevalueforapackagevariableorobjecttypeattribute.Subsequent#valuetagswillbeplacedinonetable.#raisesname[.element]textAlistofexceptionsthatcanberaisedbyaprogramunit.Subsequent#raisestagswillbeplacedinonetable.#seename[.element[;n]]Seealsohyperlink.Subsequent#seetagswillbeplacedinonetable.Tolinktoaspecificoverloadingofaprogramunit,followthenamebyasemi-colonandtheoverloadindex(1-based).Forexample:#seeemployee#seedepartment.dname;2#usagetextAtexttodescribetheusageoftheelement.#authornameTheauthoroftheobject.#versiontextTheversionoftheobject.{#linkname[.element[;n]][description]}or{#linkfilenameAnexplicithyperlink.Tolinktoaspecificoverloadingofaprogramunit,followthenamebyasemi-colonandtheoverloadindex(1-based).Theoptionaldescriptionwillbeplacedinthedocument.Forexample:浙江网新恩普软件有限公司内部资料妥善保管第4页共10页[description]}The{#linkdepartment.namedepartmentnamefunction}is...Willresultin:Thedepartmentnamefunctionis…{*}nametextAbulletofabulletlist.Usefultodescribepossiblevaluesofaparameterorreturnvalue.Forexample:{*}0Thefunctionreturnedsuccessfully{*}1Theemployeedoesnotexist{*}2Theemployeerecordislocked{#skip}Skipthiscommentblockfordocumentation.注释样例详见包义乌项目后台包Sbp_Denizenmedicaremgmt:Package:CREATEORREPLACEPackageSbp_DenizenmedicaremgmtIs--居民医疗管理--#author言斌--#version2008-4-10--年度缴费生成Procedurep_Collectbalance(An_Aae001Ac47.Aae001%Type,Av_Eaz076Ac47.Eaz076%Type,Ri_RetOutInt,Rv_MsgOutVarchar2);End;Packagebody:CREATEORREPLACEPackageBodySbp_DenizenmedicaremgmtIs--年度缴费生成--#paraman_aae001年度--#paramac_eaz076村--#returnri_ret返回值--#returnrc_msg返回信息--#author言斌--#version2008-4-10Procedurep_Collectbalance(An_Aae001Ac47.Aae001%Type,Av_Eaz076Ac47.Eaz076%Type,Ri_RetOutInt,Rv_MsgOutVarchar2)Is浙江网新恩普软件有限公司内部资料妥善保管第5页共10页生成文档通过选择菜单:Tools\plsqldoc来生成和察看文档。也可以通过在源代码编辑框中单击鼠标右键,在弹出菜单中选择生成和察看文档。文档生成后的效果如下图所示:浙江网新恩普软件有限公司内部资料妥善保管第6页共10页2.格式化你的代码内层代码要空两格。空两格的优点是:当层次发生变化时,我可以使用“TAB”键或“SHIFT+TAB”组合键将选择的代码块前移两格或后移两格,来改变代码块的层次。我们看看下面的代码格式。不用关心这段代码究竟实现了什么,注意看的是它内层与外层的逻辑关系是通过空格来直观表现的。3.编写规范和健壮的sql3.1规范的sql我们应该知道“绑定变量”的概念。要实现绑定变量,首要的一点是两个sql的格式统一。我们看看这样的sql格式是否必要:关键字对齐。浙江网新恩普软件有限公司内部资料妥善保管第7页共10页3.2健壮的sql而且,要知道每个sql都有可能出错的。所以我们需要使用异常捕获语句包裹每个sql,并给出恰当的提示。比如某系统前段时间一直有no_data_found的错误,程序抛出的异常就是这个。很简单,这说明我们的程序中有个select语句查询结果为空,但并没有捕获这个异常,所以直接抛出了no_data_found。这个错误是无法定位的。每个编写的sql应该是类似这样的:BeginSqlstatement;ExceptionWhen错误1then错误处理;When错误2then错误处理;……Whenothersthen其他错误的捕获End;这样,这个sql就在我们的控制之中了,如果提示信息足够准确,很容易定位到出错的位置。下面是常用的三个sql异常捕获:sql类型相关错误异常捕获insert主键冲突dup_val_on_indexselect未查询到数据no_data_found查询到多行too_many_rows除此以外,还有我们不可预期的错误,需要最后使用“others”来捕获。关于异常的详细介绍,以及如何手工抛出指定异常,参考《oraclepl/sqlprogramming》第六章。4.使执行部分短小:告别意大利面条式的代码。浙江网新恩普软件有限公司内部资料妥善保管第8页共10页以我们的过程“prc_p_bj”为例。其所在的包一直报“pls_00123:程序太大”,其实是因为该过程的“意大利面条式的代码”。该过程有2000多行,嵌套了若干次。更不幸的是,pl/sql编译器并不能识别这么多的嵌套。稍微分析一下,就发现这个过程包括三大部分:A、B、C。这是三个相互独立的业务,可以分成三个子过程来调用。这样就省去了一层嵌套。再分析每个子过程,可以发现每个都包括了五个小部分的分别实现。这又可以拆分成五个子