《plsql编码开发规范》由会员分享,可在线阅读,更多相关《plsql编码开发规范(9页珍藏版)》请在金锄头文库上搜索。
1、PLSQL 开发规 范Andrew.zhao日期 作者 版本 变更说明2013-6-7 Andrew.zhao V1.0 原始版1. PL/SQL编码规范1.1.使用工具Toad 或 PL/SQL Developer 1.2.使用基表 (视图 )别名在 SQL语句中为表或视图指定别名。其命名规格以简短为原则,一般为基表或视图名称每一节单词的第一个字母,如 mtl_system_items的别名一般指定为 msi。1.3.例外处理尽可能多的使用 EXCEPTION捕捉各种例外,并返回用户可读懂的信息,如无法确定是否有其它例外,可在每个 PL/SQL程序块的例外中加上 WHEN OTHERS语句。
2、例外信息统一风格,定义统一的例外处理 Package统一返回在哪个 Package、Procedure 中发生的例外对日志中的一些调试信息,通过参数设定是否需要输出语法如下:EXCEPTIONWHEN OTHERS THENFND_FILE.PUT_LINE(FND_FILE.OUTPUT, SQLCODE);FND_FILE.PUT_LINE(FND_FILE.OUTPUT, SQLERRM);END;1.4.注释PL/SQL有两种表示注释的方法,分别为- -和/* */,对于多行或整段的注释一般采用后者,对于单行或行尾的注释一般采用前者。以下从几个主要地方注释做个规定,力求统一。注释风格:
3、注释单独成行、放在语句前面。 应对不易理解的分支条件表达式加注释; 对重要的计算应说明其功能; 过长的函数实现,应将其语句按实现的功能分段加以概括性说明; 常量及变量注释时,应注释被保存值的含义(必须),合法取值的范围;可采用单行/多行注释。(- 或 /* */ 方式) 。 包、过程、函数注释(代码头信息注释规范)/*=* Copyright (C) CNC All rights reserved * =* Program Name: Package Name* Author : $OSUSER* Date : $DATE $TIME* Purpose : Purpose* Parameter
4、s :* In X -参数 X 的简要说明* Out Y -参数 Y 的简要说明* Called :* Called By :* Description :* * Update History* Version Date Name Description* - - - -* V1.0 $DATE $OSUSER Creation *=*/如增加包中的过程或函数,需在包的注释中的 Update History中增加相应的信息。如仅是修改过程或函数,则在过程或函数的注释中的 Update History中增加相应的信息。 注释的基本原则过程中定义的变量需要注释其含义,过程或函数中关键性语句也要注释
5、其作用,对于较复杂的程序,则对该段程序的流程进行描述,在程序中的关键位置应加入相应的注释,对于非首次作者修改原有的程序,要对所做的修改部分加以标示,并作相应的注释。注释的格式无特殊要求,一般单行以- -注释,多行以/* */注释。 增加程序select count(*)from where and -added by xxx 2006-05-28and -end added by xxx 2006-05-28and 蓝色部分为新增加的程序 修改/删除程序select count(*)from where and -changed by xxx 2006-05-28-and and -end c
6、hanged by xxx 2006-05-28and 蓝色部分为修改的程序,修改为1.5.代码语法规范语法规范主要包括变量规范、包规范、游标规范、事务处理规范等等1.5.1.变量规范1) 变量名全部采用小写,局部变量名使用“v_”开头,输入参数以“i_开头,输出参数以“o_”开头,输入输出参数用 io_开头。所有输入参数必须显示声明。2) 游标的命名,游标统一用“c_” 命名。3) 使用命名的常量以避免硬编码,使用常量包,常量统一用 cn_ 的前缀命名。4) 当变量代表列时,使用%TYPE 属性,当变量实际上表示数据库表的某列数据时,为避免数据库结构修改对变量的影响,应统一使用%TYPE 属
7、性对变量命名。5) 使用%TYPE 以标准化非数据库变量的声明1.5.2.包规范包内的存储过程及函数的命名必须遵循简写规范,常用的操作简称如下:增加 add 修改 upd 删除 del查询 qry 检查 chk1.5.3.游标规范1) 外部查询的多行数据返回使用游标进行处理,通过传递游标变量的形式返回数据到外部接口,由外部程序自行 FETCH数据。2) 打开游标前,必须显式检查游标的%ISOPEN 属性。3) 使用 FETCH语句后,要立即检查%NOTFOUND 属性,以便正常终止游标 FETCH循环。4) 无论 PL/SQL程序是正常终止还是出错退出,都要关闭所有已打开的游标。在出错退出时,
8、应该在其异常处理部分管理所有游标,这可以释放一部分的系统资源。5) 尽可能使用显示游标,避免使用隐式游标。1.5.4.数据封装和访问规范1) 按照业务逻辑实现功能模块的封装,将业务规则逻辑集中在更少量的、良好设计的、易于维护的函数或者过程中,不必在每条 SQL语句或者每块 PL/SQL程序中重复这些逻辑。2) 后台数据按照逻辑划分成多个 SCHEMA,不同 SCHEMA的数据不可互相访问。3) 需要相互访问的表均存放在 INTERFACE的 SCHEMA中,通过访问 INTERFACE中的接口表实现跨 SCHEMA的数据访问。1.5.5.日志书写规范1) 采用公共的 API包完成后台日志数据记
9、录。(API 完成输出错误信息提示、记录错误信息内容到数据库表、系统级的错误代码及错误信息等)2) 后台日志的信息记录级别包括 DEBUG、INFO、WARN、ERROR、FATAL,其定义以及不同级别日志的采集标准如下:DEBUG调试信息,供开发人员调试使用,由开发人员自行确定。INFO提示信息,记录重要的系统事件或者业务事件,如开始结算等。WARN警告信息,可能导致严重错误的警告信息ERROR错误信息,导致系统运行错误的信息。FATAL致命信息,导致系统无法继续运行的致命错误信息。3) 所有表操作的错误处理部分均应记录日志信息。1.5.6.错误处理规范1) 后台中所有出现错误或者异常的地方
10、,都必须调用公共的日志模块记录日志信息。2) 凡是涉及到表操作(insert,update,select,delete)的 sql语句,都必须进行错误捕捉,不能将错误带到后面的语句。3) 从表中 select数据的语句,应严格区分 NO_DATA_FOUND 和 TOO_MANY_ROWS 的错误,并将相应错误信息填入错误信息。NO_DATA_FOUND 多数为查询条件问题导致无数据返回(用户级错误)。TOO_MANY_ROWS 应该是数据表内数据异常导致(系统级错误)。4) 所有存储过程(函数)的统一出口一律在存储过程的结束部分,不允许中间返回。5) 在每一个异常处理部分,都要定义 WHEN
11、 OTHER 子程序,以便捕获所有没有显示处理或其它类型的异常。6) 所有程序中捕获到的错误,均转换成对应的 errcode,errmsg,通过输出参数返回给调用者。7) 在每个存储过程(函数)的入口处统一先将返回错误代码(errCode)设置为-999,功能处理成功结束后再将错误代码(errCode)设置为 0(成功),避免程序过程中因错误未能正确捕获,导致功能未能完成,而程序却成功返回的情况出现。8) 所有的模块都有错误编码区间,原则上错误编码全局唯一。9) 错误信息描述应准确,业务相关的错误应将输入数据拼接到错误信息中。如会员密码错误等等。10) 错误代码根据存储过程(函数)的功能号来确
12、定,具体规则为:错误代码功能号后 7位XX,(XX 为 00 99)。即分配给每个功能点的错误代码为 100个,由开发者自己划分错误代码,自行描述错误信息,不做具体规定。1.5.7.书写规范1) PL/SQL语句的所有表名、字段名遵照数据字典的定义,系统保留字、内置函数名、PL/SQL保留字、关键字大写,用户声明的标识符小写。2) 对于子程序、触发器、包等带名的程序块,使用结束标识。3) 连接符 OR、IN、AND、以及、=等前后加上一个空格。4) 对较为复杂的 SQL语句加上注释,说明算法、功能。5) SQL语句的缩进风格:一行有多列,超过 80个字符时,基于列对齐原则,采用下行缩进;WHE
13、RE子句书写时,每个条件占一行,语句另起一行时,以保留字或者连接符开始,连接符右对齐。例如:where f1 = 1and f2 = 2or f3 = 36) INSERT语句,必须书写字段,字段可 5个或 6个一组。中间用 TAB分开。7) 多表连接时,使用表的别名来引用列。8) 供别的文件或函数调用的函数,绝不应使用全局变量交换数据。9) TAB 统一定义为 4个空格。10) 书写优化性能建议: 避免嵌套连接。例如:A = B AND B = C AND C = D WHERE条件中尽量减少使用常量比较,改用主机变量 系统可能选择基于规则的优化器,所以将结果集返回数据量小的表作为驱动表(F
14、ROM 后边最后一个表)。 大量的排序操作影响系统性能,所以尽量减少 ORDER BY和 GROUP BY排序操作。 如必须使用排序操作,请遵循如下规则排序尽量建立在有索引的列上。 如结果集不需唯一,使用 UNION ALL代替 UNION。 索引的使用尽量避免对索引列进行计算。 尽量注意比较值与索引列数据类型的一致性。 对于复合索引,SQL 语句必须使用主索引列 索引中,尽量避免使用 NULL。 对于索引的比较,尽量避免使用!= 查询列和排序列与索引列次序保持一致。 尽量避免相同语句由于书写格式的不同,而导致多次语法分析。 尽量使用共享的 SQL语句。 查询的 WHERE过滤原则,应使过滤记录数最多的条件放在最前面。 任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。 IN、OR 子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引。 11) 其它经验性规则: 尽量少用嵌套查询。如必须,请用 not exist代替 not in子句。 错误 SELECT . FROM emp WHERE dept_no NOT IN ( SELECT dept_no