华为Oracle编程规范_第1页
华为Oracle编程规范_第2页
华为Oracle编程规范_第3页
华为Oracle编程规范_第4页
华为Oracle编程规范_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、CC&CRM PDT 数据库编程规范 ORACLE分则内部公开华为技术有限公司产品密级CC&CRM PDT内部公开共49页CC&CRM PDT 数据库编程规范ORACLE分则拟制:姚理、李凌志、张可、王思杰日期:2006-02-15审核:姚理、李凌志、张可、王思杰、张杰等日期:2006-06-01签发:吕印赋日期:2006-06-07华为技术有限公司版权所有 侵权必究修 订 记 录日期修订版本描述作者2006-02-151.00初稿完成。姚理2006-05-151.01修改完成部分内容。李凌志2006-05-301.02进行部分章节调整和重新排版。张可2006-06-0

2、21.03根据培训时收集的意见进行修改。张可2006-06-091.04根据南研反馈的意见进行修改。张可2006-06-221.05根据姚理的部分意见进行修改。李凌志、张可目 录第1章范围和简介51.1简介51.2范围51.3关键词51.4术语和定义5第2章文件格式及命名62.1文件格式62.2文件命名6第3章书写规范73.1大小写风格73.2缩进风格83.3空格及换行123.4创建表153.5创建过程/函数/包15第4章命名规范17第5章注释规范22第6章常用语法266.1变量声明266.2返回值266.3符号*266.4包的使用276.5绑定变量276.6异常处理296.7事务控制306.

3、8游标使用306.9代码规模32第7章SQL建议与约束337.1建议337.2禁止36第8章开发工具418.1UltraEdit-32418.2PL/SQL Developer418.3TOAD418.4PowerDesigner42第9章数据库代码走读CheckList43第10章附录4610.1常见模块缩写表4610.2常用词缩写表47表目录表1大小写规范表7表2对象前缀表17表3ORACLE系统对象使用前缀表18表4参数、变量、常量、异常等前缀表19表5常见模块缩写表46表6常用词缩写表47第1章 范围和简介1.1 简介本规范是CC&CRM PDT数据库专家组针对关系型数据库OR

4、ACLE的相关特性,拟定的用于指导和规范产品线内相关开发过程的规范,其旨在通过该规范的约束和建议,使开发人员可以在他们所编写的代码中保持统一正确的风格,提供代码的可读性以及减少出现错误的几率。1.2 范围本规范仅适用于关系型数据库系统ORACLE以及其对应的PL/SQL脚本语言。本规范目前仅适用于CC&CRM PDT。如果该规范和公司其他规范发生冲突的时候,以本规范为准,在本规范中没有涉及的规则,则以公司其他规范为准。1.3 关键词编程规范、数据库、ORACLE、PL/SQL、CC&CRM1.4 术语和定义本规范采用以下的术语描述: 规则:编程时强制必须遵守的原则。 建议:编程

5、时必须加以考虑的原则。 说明:对此规则或建议进行必要的解释。 示例:对此规则或建议从正、反两个方面给出。第2章 文件格式及命名2.1 文件格式规则:数据库脚本文件的文件格式必须为纯文本,不允许使用包含格式文本的文件格式。2.2 文件命名规则:数据库脚本文件的文件后缀名必须为“.orasql”。建议:每个产品/项目/版本的数据库脚本文件的交付件建议提供包括但不限于以下4类数据库脚本文件,每个数据库脚本文件中所提供的内容请参考文件名中的描述:1.创建表空间、用户及授权.orasql2.创建表、约束、索引、视图、序列、同义词以及其它用户定义对象.orasql3.创建包、过程、函数及任务.orasql

6、4.创建初始数据.orasql说明:具体产品/项目/版本的数据库脚本文件交付件可以根据自己的需要增加、减少、拆分上述的脚本文件。第3章 书写规范3.1 大小写风格规则:数据库脚本中涉及到的各种保留字、关键字、操作符、数据类型、标识符、对象、字段、变量、常量等的大小写风格必须遵循以下规范:表1 大小写规范表文字类型大小写示例ORACLE保留字(Reserved Word)大写IDENTIFIED、INITIAL、LONG、MAXEXTENTS、RENAME、ROWNUM、SYSDATE、VARCHAR2ORACLE关键字(Keywords)大写ANALYZE、AUTOEXTEND、COMPILE

7、、DBA、EXTENT、INSTANCE、MAXTRANS、SAVEPOINT、TABLESPACEANSI SQL保留字(Reserved Word)大写ADD、BETWEEN、CREATE、DISTINCT、DROP、FROM、SESSION、SELECT、TABLE、UPDATE、VARCHARANSI SQL关键字(Keywords)大写BEGIN、COMMIT、CONSTRAINT、COUNT、CURSOR、DECLARE、EXECUTE、PRIMARY、SUM、TRANSACTIONPL/SQL保留字(Reserved Word)大写ARRAY、BOOLEAN、DATABASE、D

8、O、EXIT、RAISE、SAVEPOINT、RUN、WHILE、XOR操作符(Operators)大写ALL、AND、ANY、ESCAPE、EXISTS、OR、UNION数据类型(Data Types)大写INT、NUMBER、DATE系统数据库对象(System Tables、Views、Functions、Packages、Package Methods、Exceptions)大写USER$、DBA_JOBS、DECODE、SUBSTR、DBMS_OUTPUT、PUT_LINE、NO_DATA_FOUND自定义数据库对象(User Objects)大写T_PUB_TABLE_NAME、F

9、_PUB_GETID、P_KBS_GET_SERVICEINFO字段名(Field)大写USER_NAME、STAFFNO常量(Constants)大写SECONDS_OF_DAY变量(Variable)逻辑首字母大写v_BeginDate、v_FaxNumber、c_StaffAuth说明:l ORACLE的关键字和保留字请参见视图V$RESERVED_WORDS;l 上表中需要大写的关键字/保留字,可以录入UltraEdit的wordfile.txt,在使用UltraEdit开发时输入这些关键字保留字后会自动变为大写。3.2 缩进风格规则:脚本代码块采用缩进风格书写,保证代码清晰易读,风格

10、一致。缩进格数统一为2个空格,但需要关键字右对齐或者参数/字段向上对齐的时候例外。示例1:CREATE SEQUENCE SQ_CSP_TABLENAME MINVALUE 1 START WITH 1 INCREMENT BY 1;示例2:IF c_CursorName%ISOPEN THEN CLOSE c_CursorName;END IF;规则:缩进必须使用空格键,不允许使用TAB键。规则:同一条语句占用多于一行时,每行的第一个关键字应当右对齐,但INSERT.SELECT语句例外。示例1:FETCH c_Cursor INTO v_Field1, v_Field2, . 关键字右对齐

11、示例2:SELECT FIELD1, FIELD2, . FROM T_CSP_TABLENAME WHERE FIELD1 > 1 AND (FIELD2 < SYSDATE OR FIELD2 > SYSDATE + 3) AND FIELD3 LIKE 'HUAWEI%' GROUP BY FIELD1, FIELD2 ORDER BY FIELD1, FIELD2; 关键字右对齐规则:在INSERT.SELECT语句中,如果需要换行时,应使INSERT INTO部分的字段与SELECT部分的字段一一对应,以增强可读性。示例:错误的写法:BEGIN IN

12、SERT INTO T_DEST_TABLENAME (DESTFIELDNAME1, DESTFIELDNAME2, DESTFIELDNAME3, DESTFIELDNAME4, DESTFIELDNAME5, DESTFIELDNAME6, DESTFIELDNAME7) SELECT SRCFIELDNAME1, SRCFIELDNAME2, SRCFIELDNAME3, SRCFIELDNAME4, SRCFIELDNAME5, SRCFIELDNAME6, SRCFIELDNAME7 FROM T_SRC_TABLENAME;END;正确的写法A:BEGIN INSERT INTO

13、 T_DEST_TABLE_NAME (DESTFIELDNAME1, DESTFIELDNAME2, DESTFIELDNAME3, DESTFIELDNAME4, DESTFIELDNAME5, DESTFIELDNAME6, DESTFIELDNAME7) SELECT SRCFIELDNAME1, SRCFIELDNAME2, SRCFIELDNAME3, SRCFIELDNAME4, SRCFIELDNAME5, SRCFIELDNAME6, SRCFIELDNAME7 FROM T_SRC_TABLE_NAME;END;正确的写法B:BEGIN INSERT INTO T_DEST

14、_TABLE_NAME (DESTFIELDNAME1, - 注释 DESTFIELDNAME2, - 注释 DESTFIELDNAME3, - 注释 DESTFIELDNAME4, - 注释 DESTFIELDNAME5, - 注释 DESTFIELDNAME6, - 注释 DESTFIELDNAME7) - 注释 SELECT SRCFIELDNAME1, - 注释 SRCFIELDNAME2, - 注释 SRCFIELDNAME3, - 注释 SRCFIELDNAME4, - 注释 SRCFIELDNAME5, - 注释 SRCFIELDNAME6, - 注释 SRCFIELDNAME7

15、 - 注释 FROM T_SRC_TABLE_NAME;END;正确的写法C:BEGIN INSERT INTO T_DEST_TABLE_NAME ( DESTFIELDNAME1, - 注释 DESTFIELDNAME2, - 注释 DESTFIELDNAME3, - 注释 DESTFIELDNAME4, - 注释 DESTFIELDNAME5, - 注释 DESTFIELDNAME6, - 注释 DESTFIELDNAME7) - 注释 SELECT SRCFIELDNAME1, - 注释 SRCFIELDNAME2, - 注释 SRCFIELDNAME3, - 注释 SRCFIELDN

16、AME4, - 注释 SRCFIELDNAME5, - 注释 SRCFIELDNAME6, - 注释 SRCFIELDNAME7 - 注释 FROM T_SRC_TABLE_NAME;END;说明:1、 在错误的写法中,虽然SELECT语句部分的SRCFIELDNAME1, SRCFIELDNAME2, SRCFIELDNAME3可以写在一行中,但由于INSERT INTO语句部分中DESTFIELDNAME1, DESTFIELDNAME2写在一行中,而DESTFIELDNAME3在下一行,因此SELECT语句中每行的字段应与INSERT INTO语句中的字段一一对应(如正确的写法A);2、

17、 INSERT INTO语句中的各个字段折行后,应缩进并与上一字段左对齐(如正确的写法B),或者与INTO关键字左对齐(如正确的写法C);3、 SELECT语句中折行后的第一个字段名应缩进并与上一行的第一个字段名左对齐。规则:INSERT INTO语句中,如果需要对每个字段增加注释,应将每个字段单独列为一行,并在行尾增加注释。示例1:INSERT INTO T_DEST_TABLE_NAME (DESTFIELDNAME1, - 注释1 DESTFIELDNAME2, - 注释2 DESTFIELDNAME3) - 注释3VALUES (FieldValue1, FieldValue2, Fi

18、eldValue3);或者INSERT INTO T_DEST_TABLE_NAME ( DESTFIELDNAME1, - 注释1 DESTFIELDNAME2, - 注释2 DESTFIELDNAME3) - 注释3VALUES ( FieldValue1, FieldValue2, FieldValue3);或者INSERT INTO T_DEST_TABLE_NAME( DESTFIELDNAME1, - 注释1 DESTFIELDNAME2, - 注释2 DESTFIELDNAME3 - 注释3)VALUES( FieldValue1, FieldValue2, FieldValue

19、3);其他说明:1、 在规范的代码模板中详细给出了各种情况下的范例写法,请编码过程参考;2、 在数据库脚本的编码过程中,请严格按照代码模板进行书写;3、 对于模板中未涉及的情况,应在保证符合上述规范原则,同时和代码模板中的风格保持一致的前提下,根据实际情况灵活处理。3.3 空格及换行规则:不允许把多个短语句写在一行中,即一行只写一条语句。示例:v_Variable1 := 1; v_Variable2 := 'abc'应写成:v_Variable1 := 1; v_Variable2 := 'abc'说明:两个赋值语句不能写在一行中,必须分两行写。规则:相对独立

20、的程序块之间、变量说明之后必须加空行。示例:v_Variable1 := 1;IF v_BeginDate IS NULL THEN v_BeginDate := SYSDATE - 15;END IF;应写成:- 初始化局部变量v_Variable1 := 1; - 判断开始时间IF v_BeginDate IS NULL THEN v_BeginDate := SYSDATE - 15;END IF;说明:两个程序块在逻辑上相对独立,应用空行加以分隔,同时增加注释。建议:建议对超过120字符的语句要分行书写,长表达式应在低优先级操作符处换行,操作符或关键字放在新行之首。划分出的新行应适当地

21、缩进,使排版整齐、语句可读。是否分行应根据实际情况而定,原则是保证代码整齐、语句可读。分行示例: 120字符 (a * b * c * d) + (e * f) + 应写成: (a * b * c * d) + (e * f) + 说明:1、 加法的优先级低于乘法,因此应在加号处换行;2、 两组乘法虽然在逻辑上会先于加法执行,但显式加上括号使可读性更强。不分行示例:具体内容请参见代码模板“创建初始化数据模板”部分,有时初始化数据的语句不分行情况下可读性更强。规则:调用函数或过程时,如果参数列表超过120字符,应根据逻辑内容进行换行,或者每个参数占用一行。示例:错误的写法: 120字符 P_PR

22、OCEDURE(i_Param1, i_Param2, i_Param3, o_Param1, oParam2, .);正确的写法A:P_PROCEDURE(i_Param1, i_Param2, i_Param3, o_Param1, o_Param2, .);正确的写法B:P_PROCEDURE(i_Param1, - 注释 i_Param2, - 注释 i_Param3, - 注释 o_Param1, - 注释 o_Param2, - 注释 .) - 注释说明:1、 因为前三个为输入参数,后两个为输出参数,因此在第3、4参数之间换行比较清晰(如正确的写法A);2、 有时为了增加注释,可以

23、使每个参数皆占用一行(如正确的写法B);3、 参数换行以后与上一行的第一个参数对齐。规则:双目运算符、操作符前后应以空格分隔,间隔符之后应以空格分隔。示例:v_DateVar:=TO_DATE('2001-01-01 01:30:00','YYYY-MM-DD HH24:MI:SS');v_IntegerVar1:=v_IntegerVar2+v_IntegerVar3;IF v_Number>0 THEN应写成:v_DateVar := TO_DATE('2001-01-01 01:30:00', 'YYYY-MM-DD HH24

24、:MI:SS'); 赋值符前后加空格 逗号后面加空格v_IntegerVar1 := v_IntegerVar2 + v_IntegerVar3; 赋值符前后加空格 加号前后加空格IF v_Number > 0 THEN 比较符号前后加空格建议:不同优先级的操作符混合使用时,建议使用括号进行隔离。示例: a * b + c 应写成: (a * b) + c 说明:使用括号使代码的优先级更加清晰,而且可以避免犯错。建议:SQL语句中存在不同优先级的关系运算符时,建议使用括号。示例:WHERE FIELD1 > 1 AND FIELD2 < SYSDATE OR FIEL

25、D3 > SYSDATE + 3应写成:WHERE (FIELD1 > 1 AND FIELD2 < SYSDATE) OR (FIELD3 > SYSDATE + 3)说明:如果SQL语句的条件复杂,很容易出现问题,因此增加括号可以提高可阅读性。3.4 创建表规则:脚本中的字段名缩进为2个空格。规则:脚本中字段名称、字段类型、DEFAULT关键字应左对齐,NULL/NOT NULL应右对齐(也可以认为就是NULL关键字左对齐)。示例:CREATE TABLE T_WF_TABLE_NAME( INTFIELDINTNOT NULL, FLOATFIELDNUMBER(

26、4, 2)DEFAULT 1.23NOT NULL, DATEFIELDDATEDEFAULT SYSDATENULL, VARCHAR2FIELDVARCHAR2(200)NULL)TABLESPACE SERVICE_MAIN_DAT;说明:至于每行中的每个项目之间使用多少个空格没有明确要求,只要求从纵向上各个字段的名称、数据类型、缺省值、是否为空等对齐美观即可。3.5 创建过程/函数/包规则:脚本中的参数缩进为2个空格。规则:脚本中的参数名称、数据类型、注释信息应左对齐,IN/OUT/IN OUT关键字左对齐右对齐皆可。示例:CREATE OR REPLACE PROCEDURE P_C

27、SP_PROCEDURENAME( i_DateParamDATE,- 注释 o_IntParamIN OUTINT,- 注释 o_VarcharParam OUTVARCHAR2,- 注释 o_RetCode OUTINT- 注释)或者CREATE OR REPLACE PROCEDURE P_CSP_PROCEDURENAME( i_DateParamDATE,- 注释 o_IntParamIN OUTINT,- 注释 o_VarcharParamOUTVARCHAR2,- 注释 o_RetCodeOUTINT- 注释)说明:至于每行中的每个项目之间使用多少个空格没有明确要求,只要求从纵向

28、上各个参数的名称、数据类型、IN/OUT关键字等对齐美观即可。第4章 命名规范规则:所有用户自定义的数据库对象名称统一使用形如“对象前缀+下划线+模块名缩写+下划线+对象名称”的格式。说明:l 因为所有字符统一使用大写,所以对象名称中可以根据需要再使用下划线进行分隔;l 对象类型前缀建议不要超过三个字符,可参考以下对象前缀表;l 编码时禁止以ORACLE系统对象的前缀作为对象类型前缀,具体请参考ORACLE系统对象使用前缀表;l 模块名缩写建议不要超过三个字符,可参考附录中的常见模块名缩写表;l 数据表字段名称没有前缀;l 对象名称长度不宜超过18个字符。表2 对象前缀表对象类型前缀示例备注表

29、空间命名(TableSpace)TBSTBS_CSP_MAIN_DATA表(Table)TT_CSP_TABLENAMET_PUB_DATA_DICT视图(View)VV_WF_VIEWNAME字段(Field)无USERNAMECREATE_DATE序列(Sequence)SQSQ_MS_PLANSCAN索引(Index)IXIX_WF_SVCINFO_SN如果表名或字段名过长,则用表名和字段名的缩写表示唯一索引UIXUIX_WF_DEALINFO_SN如果表名或字段名过长,则用表名和字段名的缩写表示主键(Primary Key)PKPK_WF_ADDJSPFILE如果表名过长,则用表名的缩

30、写表示外键(Foreign Key)FKFK_KBS_T1_T2T1为外键所在的表,T2为外键所参照的表簇(Cluster)CLCL_UMP_TABLENAME如果表名过长,则用表名的缩写表示触发器(Trigger)TRTR_MKT_TRIGGERNAME过程(Stored Procedure)PP_SAL_PROC_NAME函数(Function)FF_PUB_FUNC_NAME包(Package)PKGPKG_COM_PKGNAME同义词(Synonyms)SYNSYN_OTH_CITY保存点(SavePoint)SPTSPT_MOD_SPTNAME类型(Type)TYPTYP_SYS_T

31、YPENAME表3 ORACLE系统对象使用前缀表对象类型前缀示例簇(Cluster)C_C_USER#索引(Index)AQ$_HS$_I_SYS_AQ$_MSGTYPE_PRIMARYHS$_GRANTUSER_PKI_AUDITSYS_C00512包(Package)DBMS_UTL_DBMS_OUTPUTUTL_FILE序列(Sequence)AQ$_EVT_HS$_ORA_REPCAT$_SMP_SYSTEM_AQ$_QIDSEQEVT_NOTIFY_SEQHS$_CLASS_CAPS_SORA_TQ_BASE#REPCAT$_REPPROP_KEYSMP_LONG_IDSYSTEM

32、_GRANT同义词(Synonyms)DEF$_SMP_DEF$_ERRORSMP_JOB_ID表(Table)AQ$_HS$_DEF$_EVT_REPCAT$_SMP_AQ$_MESSAGE_TYPESHS$_PRIVILEGESDEF$_LOBEVT_OPERATORSREPCAT$_DDLSMP_JOB视图(View)AQ$_SMP_AQ$_DEF$_AQCALLSMP_BLOB规则:所有用户定义的存储过程或函数中使用的参数、变量、异常等统一采用“小写前缀+下划线+逻辑首字母大写”的格式,其中的小写前缀代表参数、变量、类型或异常等的类型,而常量则统一使用全部大写(可根据情况使用下划线进行

33、分隔)。小写前缀请参考下表: 表4 参数、变量、常量、异常等前缀表变量类型首字母示例备注函数、过程输入参数ii_BeginDatei_EndDate函数、过程输出、输入输出参数oo_SQL函数、过程局部变量vv_WorkerNo游标变量cc_Cursor自定义常量无SECONDS_OF_DAYPI自定义常量要求全部大写,无前缀。自定义异常exex_UserException记录rr_ServiceInfo自定义类型变量typtyp_NameList规则:标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解。建议:较短的单词可通过去掉“元音”形成缩写

34、;较长的单词可取单词的头几个字母形成缩写;一些单词有大家公认的缩写,请参考附录中的常用词缩写表。规则:命名中若使用特殊约定或缩写,则要有注释说明。说明:应该在源文件的开始之处,对文件中所使用的缩写或约定,特别是特殊的缩写,进行必要的注释说明。规则:所有的命名不允许使用拼音,必须使用英文命名。规则:使用有意义、易于记忆、描述性强、简短及具有唯一性的英文单词。使用下划线要有一致性,要么不用。自己特有的命名风格,要自始至终保持一致,不可来回变化。说明:个人的命名风格,在符合所在项目组或产品组的命名规则的前提下,才可使用。(即命名规则中没有规定到的地方才可有个人命名风格)。规则:对于变量命名,禁止取单

35、个字符(如i、j、k.),建议除了要有具体含义外,还能表明其变量类型、数据类型等。形如i、j、k的变量只允许作为局部循环变量。说明:变量,尤其是局部变量,如果用单个字符表示,很容易敲错(如i写成j),而编译时又检查不出来,有可能为了这个小小的错误而花费大量的查错时间。规则:除非必要,不允许使用数字或较奇怪的字符来定义标识符。示例:如下命名,使人产生疑惑。DECLARE temp_0_TEST VARCHAR2(10);规则:用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。示例:Start <-> Finish启动 <-> 完成First <-> L

36、ast第一个 <-> 最后一个Prior <-> Next前一个 <-> 后一个Add <-> Remove增加 <-> 删除Create <-> Destroy创建 <-> 析构Get <-> Set获取 <-> 设置Increment <-> Decrement增量 <-> 减量Lock <-> UnLock加锁 <-> 解锁Open <-> Close打开 <-> 关闭第5章 注释规范建议:存储过程/函数脚本代

37、码有效注释量应该在20以上。说明:注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。规则:在数据库脚本文件头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、修改日志等,头文件的注释中还应有函数或过程功能简要说明。示例:- File Name: 该脚本文件的文件名- Author: 该脚本文件的作者姓名与工号- Version: 该脚本文件的版本号- Date: 该脚本文件的最后更新日期- Copyright: 该脚本文件的版权信息- Description: 该脚本文件的描述信息- Usag

38、e: 简要描述该脚本的使用/加载方法- Function List: 该脚本文件提供对象、函数、过程的列表- Comments: 该脚本文件的注释信息- History: 该脚本文件的维护历史信息- 1. Date: 修改日期,格式为YYYY-MM-DD- Author: 修改人姓名与工号- Modification: 修改说明- 2. .-说明:格式内容请参见代码模板文件头。规则:函数/存储过程头部应进行注释,列出:功能说明、设计人、编码人、创建日期、修改记录、调用关系(可选)等,输入参数/输出参数/返回值的说明直接添加到参数后面。示例:CREATE OR REPLACE FUNCTION

39、F_CSP_FUNCTIONNAME/* Description: 该函数的功能说明 Author: 姓名 工号 Date: YYYY-MM-DD Version: 版本 Caller: 调用者 Callee: 被调用者 Comments: 注释信息(包括产生异常的说明) History: 1.Date: 修改日期,格式为YYYY-MM-DDAuthor: 修改人姓名与工号Modification: 修改说明 2. .*/( i_DateParamDATE,- 输入参数注释。包括含义、值域等。 o_IntParamIN OUTVARCHAR2,- 输入输出参数注释。 o_FloatParam

40、OUTINT- 输出参数描述。) RETURN INT- 返回值。AS规则:边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。规则:注释的内容要清楚、明了,含义准确,防止注释二义性。说明:错误的注释不但无益反而有害。规则:避免在注释中使用缩写,特别是非常用缩写。说明:在使用缩写时或之前,应对缩写进行必要的说明。规则:单行注释符“-”后必须加上一个空格。规则:注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。示例:BEGIN - i_DateParam必须早于当前时

41、间 IF i_DateParam >= SYSDATE THEN RETURN 1; END IF; END;规则:注释与所描述内容进行同样的缩进。说明:可使程序排版整齐,并方便注释的阅读与理解。规则:注释与其上的代码用空行隔开。建议:对变量的定义和分支语句(条件分支、循环语句等)建议给出注释。说明:这些语句往往是程序实现某一特定功能的关键,对于维护人员来说,良好的注释帮助更好的理解程序,有时甚至优于看设计文档。规则:不允许在一行代码或表达式的中间插入注释。说明:不应在代码或表达中间插入注释,否则容易使代码可理解性变差。规则:通过对函数或过程、变量、结构等合适的命名以及合理地组织代码的结

42、构,使代码成为自注释的。说明:清晰准确的函数、变量等的命名,可增加代码可读性,并减少不必要的注释。规则:在代码的功能、意图层次上进行注释,提供有用、额外的信息。说明:注释的目的是解释代码的目的、功能和采用的方法,提供代码以外的信息,帮助读者理解代码,防止没必要的重复注释信息。示例:如下注释意义不大- i_RetCode = 0IF i_RetCode = 0 THEN而如下的注释则给出了额外有用的信息。- 流程传入的标志为发送成功IF i_RetCode = 0 THEN第6章 常用语法6.1 变量声明规则:代码中声明与表的字段相对应的变量时,应保证变量名和字段名相同。说明:这样要求的目的是增

43、强可读性。示例:DECLARE v_DateField T_TABLENAME.DATEFIELD%TYPE;BEGIN SELECT DATEFIELD INTO v_DateField FROM T_TABLENAME WHERE ROWNUM = 1;END;规则:代码中声明与表的字段相对应的变量时,对类型的定义需要使用%TYPE方式。说明:这样表结构的变动不会影响存储过程,避免表结构变更后出现变量长度或类型不一致的问题。6.2 返回值规则:函数的返回值定义应遵从下列规范:成功出口返回0,失败出口返回大于0整数。过程中定义的用于返回错误码的OUTPUT参数,其定义应遵从下列规范:成功出口

44、返回0,失败出口返回非0整数。6.3 符号* 规则:脚本中不允许出现“*”的用法,必须用实际的字段名代替,INSERT语句必须指定要插入的字段名。示例:1、游标定义错误用法:CURSOR c_CursorName IS SELECT * FROM TABLENAME .正确用法:CURSOR c_CursorName IS SELECT FIELD1, FIELD2, . FROM TABLENAME .2、INSERT 语句错误用法:INSERT INTO TABLENAME VALUES .正确用法:INSERT INTO TABLENAME (FIELD1, FIELD2, .) VAL

45、UES .6.4 包的使用建议:ORACLE的包类似C+中的Class,有包头和包体两部分组成;包能够把相关的功能封装性在一个包中,包里面里可以有函数和过程。PACKAGE与PROCEDURE和FUNCTION的优点是封装性比较好;在开发过程中,可以把功能点紧密相关的PROCEDURE、FUNCTION封装在一个包里面。在对包体进行编译时,调用该包的存储过程不会失效。6.5 绑定变量规则:使用绑定变量的SQL语句,能使用绑定变量方式的业务逻辑下不允许使用绑定常量实现。说明:在存储过程拼SQL语句作为动态SQL执行时,尤其需要注意。示例:错误用法:v_SQL := 'DELETE FRO

46、M TABLENAME WHERE FIELD1 > SYSDATE AND FIELD2 = 102'EXECUTE IMMEDIATE v_SQL;正确用法:v_ID := 102;v_SQL := 'DELETE FROM TABLENAME WHERE FIELD1 > :1 AND FIELD2 = :2'EXECUTE IMMEDIATE v_SQL USING SYSDATE, v_ID;规则:为提升性能,减少循环的开销,可以使用批量绑定。说明:下面示例中的UPDATE语句可以一次将多条记录进行更新,而避免了通过使用循环同一条SQL执行多次。示

47、例:CREATE OR REPLACE PROCEDURE P_CSP_TEST/* Description: 根据输入的多个工单流水号,更新对应的SERVICECLASSID值 Author: 姓名 工号 Date: YYYY-MM-DD Version: 版本 Caller: 调用者 Callee: 被调用者 Comments: 注释信息 History: 1.Date: 修改日期,格式为YYYY-MM-DDAuthor: 修改人姓名与工号Modification: 修改说明 2. .*/( i_SerialNos VARCHAR2, - 一次输入多个工单流水号以''分隔&

48、#39; i_ServiceClassID VARCHAR2, o_Ret OUT VARCHAR2 - 成功返回0,失败返回1)AS TYPE typ_StrArray IS TABLE OF VARCHAR2(500) INDEX BY BINARY_INTEGER; v_ArrSerial typ_StrArray;BEGIN FOR i IN 1.9999 LOOP - 把输入参数的值取出存放在数组v_ArrSerial中 EXIT WHEN GetParamStr(i_SerialNos, '', i, v_ArrSerial(i) <> 0; END L

49、OOP; - 根据数组中的工单流水号批量更新 FORALL i IN 1.v_ArrSerial.COUNT UPDATE T_WF_SERVICEINFO t SET t.SERVICECLASSID = i_ServiceClassID WHERE SerialNo = v_ArrSerial(i); COMMIT; o_Ret := 0;EXCEPTION WHEN OTHERS THEN ROLLBACK; o_Ret := 1;END;6.6 异常处理规则:函数/过程中应该有异常处理的代码,除非需要将任何可能的异常都向上抛出。说明:不论代码逻辑是否简单,只要有可能会抛出异常,函数/过程块就应该包括异常处理代码。详见代码模板。规则:如果需要的话,可以在异常处理部分将异常继续向上抛出给调用者。说明:如果有些异常是预料可能产生,而且脚本需要根据是否有异常来做不同的逻辑处理,这种情况可以在异常处理部分将该异常进行处理,但可能有些

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论