ORACLE开发规范_第1页
ORACLE开发规范_第2页
ORACLE开发规范_第3页
ORACLE开发规范_第4页
ORACLE开发规范_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

1、wordORACLE数据库编程标准目 录第1章范围和简介41.1简介41.2范围41.3关键词41.4术语和定义4第2章文件格式及命名52.1文件格式52.2文件命名5第3章书写标准63.1大小写风格63.2缩进风格73.3空格及换行113.4创立表143.5创立过程/函数/包14第4章命名标准16第5章注释标准21第6章常用语法256.1变量声明256.2返回值256.3符号*256.4包的使用266.5绑定变量266.6异常处理286.7事务控制296.8游标使用296.9代码规模31第7章SQL建议与约束327.1建议327.2禁止35第8章开发工具408.1UltraEdit-3240

2、8.2PL/SQL Developer408.3TOAD408.4PowerDesigner41第9章数据库代码走读CheckList42第10章附录4510.1常见模块缩写表4510.2常用词缩写表46表目录表1大小写标准表7表2对象前缀表17表3ORACLE系统对象使用前缀表18表4参数、变量、常量、异常等前缀表19表5常见模块缩写表46表6常用词缩写表47第1章 范围和简介1.1 简介本标准是针对关系型数据库ORACLE的相关特性,拟定的用于指导和标准相关开发过程的标准,其旨在通过该标准的约束和建议,使开发人员可以在他们所编写的代码中保持统一正确的风格,提供代码的可读性以及减少出现错误的

3、几率。1.2 范围本标准仅适用于关系型数据库系统ORACLE以及其对应的PL/SQL脚本语言。1.3 关键词编程标准、数据库、ORACLE、PL/SQL1.4 术语和定义本标准采用以下的术语描述: 规那么:编程时强制必须遵守的原那么。 建议:编程时必须加以考虑的原那么。 说明:对此规那么或建议进行必要的解释。 例如:对此规那么或建议从正、反两个方面给出。第2章 文件格式2.1 文件格式规那么:数据库脚本文件的文件格式必须为纯文本,不允许使用包含格式文本的文件格式。第3章 书写标准3.1 大小写风格规那么:数据库脚本中涉及到的各种保存字、关键字、操作符、数据类型、标识符、对象、字段、变量、常量等

4、的大小写风格必须遵循以下标准:表1 大小写标准表文字类型大小写例如ORACLE保存字Reserved Word大写IDENTIFIED、INITIAL、LONG、MAXEXTENTS、RENAME、ROWNUM、SYSDATE、VARCHAR2ORACLE关键字Keywords大写ANALYZE、AUTOEXTEND、COMPILE、DBA、EXTENT、INSTANCE、MAXTRANS、SAVEPOINT、TABLESPACEANSI SQL保存字Reserved Word大写ADD、BETWEEN、CREATE、DISTINCT、DROP、FROM、SESSION、SELECT、TABL

5、E、UPDATE、VARCHARANSI SQL关键字Keywords大写BEGIN、COMMIT、CONSTRAINT、COUNT、CURSOR、DECLARE、EXECUTE、PRIMARY、SUM、TRANSACTIONPL/SQL保存字Reserved Word大写ARRAY、BOOLEAN、DATABASE、DO、EXIT、RAISE、SAVEPOINT、RUN、WHILE、XOR操作符Operators大写ALL、AND、ANY、ESCAPE、EXISTS、OR、UNION数据类型Data Types大写INT、NUMBER、DATE系统数据库对象System Tables、Vie

6、ws、Functions、Packages、Package Methods、Exceptions大写USER$、DBA_JOBS、DECODE、SUBSTR、DBMS_OUTPUT、PUT_LINE、NO_DATA_FOUND自定义数据库对象User Objects大写T_PUB_TABLE_NAME、F_PUB_GETID、P_KBS_GET_SERVICEINFO字段名Field大写USER_NAME、STAFFNO常量Constants大写SECONDS_OF_DAY变量Variable逻辑首字母大写v_BeginDate、v_FaxNumber、c_StaffAuth说明:l ORAC

7、LE的关键字和保存字请参见视图V$RESERVED_WORDS;l 上表中需要大写的关键字/保存字,可以录入UltraEdit的wordfile.txt,在使用UltraEdit开发时输入这些关键字保存字后会自动变为大写。3.2 缩进风格规那么:脚本代码块采用缩进风格书写,保证代码清晰易读,风格一致。缩进格数统一为2个空格,但需要关键字右对齐或者参数/字段向上对齐的时候例外。例如1:CREATE SEQUENCE SQ_CSP_TABLENAME MINVALUE 1 START WITH 1 INCREMENT BY 1;例如2:IF c_CursorName%ISOPEN THEN CLO

8、SE c_CursorName;END IF;规那么:缩进必须使用空格键,不允许使用TAB键。规那么:同一条语句占用多于一行时,每行的第一个关键字应当右对齐,但INSERT.SELECT语句例外。例如1:FETCH c_Cursor INTO v_Field1, v_Field2, . 关键字右对齐例如2:SELECT FIELD1, FIELD2, . FROM T_CSP_TABLENAME WHERE FIELD1 > 1 AND (FIELD2 < SYSDATE OR FIELD2 > SYSDATE + 3) AND FIELD3 LIKE 'HUAWEI

9、%' GROUP BY FIELD1, FIELD2 ORDER BY FIELD1, FIELD2; 关键字右对齐规那么:在INSERT.SELECT语句中,如果需要换行时,应使INSERT INTO局部的字段与SELECT局部的字段一一对应,以增强可读性。例如:错误的写法:BEGIN INSERT INTO T_DEST_TABLENAME (DESTFIELDNAME1, DESTFIELDNAME2, DESTFIELDNAME3, DESTFIELDNAME4, DESTFIELDNAME5, DESTFIELDNAME6, DESTFIELDNAME7) SELECT SR

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

11、ME1, SRCFIELDNAME2, SRCFIELDNAME3, SRCFIELDNAME4, SRCFIELDNAME5, SRCFIELDNAME6, SRCFIELDNAME7 FROM T_SRC_TABLE_NAME;END;正确的写法B:BEGIN INSERT INTO T_DEST_TABLE_NAME (DESTFIELDNAME1, - 注释 DESTFIELDNAME2, - 注释 DESTFIELDNAME3, - 注释 DESTFIELDNAME4, - 注释 DESTFIELDNAME5, - 注释 DESTFIELDNAME6, - 注释 DESTFIELDN

12、AME7) - 注释 SELECT SRCFIELDNAME1, - 注释 SRCFIELDNAME2, - 注释 SRCFIELDNAME3, - 注释 SRCFIELDNAME4, - 注释 SRCFIELDNAME5, - 注释 SRCFIELDNAME6, - 注释 SRCFIELDNAME7 - 注释 FROM T_SRC_TABLE_NAME;END;正确的写法C:BEGIN INSERT INTO T_DEST_TABLE_NAME ( DESTFIELDNAME1, - 注释 DESTFIELDNAME2, - 注释 DESTFIELDNAME3, - 注释 DESTFIELD

13、NAME4, - 注释 DESTFIELDNAME5, - 注释 DESTFIELDNAME6, - 注释 DESTFIELDNAME7) - 注释 SELECT SRCFIELDNAME1, - 注释 SRCFIELDNAME2, - 注释 SRCFIELDNAME3, - 注释 SRCFIELDNAME4, - 注释 SRCFIELDNAME5, - 注释 SRCFIELDNAME6, - 注释 SRCFIELDNAME7 - 注释 FROM T_SRC_TABLE_NAME;END;说明:1、 在错误的写法中,虽然SELECT语句局部的SRCFIELDNAME1, SRCFIELDNAM

14、E2, SRCFIELDNAME3可以写在一行中,但由于INSERT INTO语句局部中DESTFIELDNAME1, DESTFIELDNAME2写在一行中,而DESTFIELDNAME3在下一行,因此SELECT语句中每行的字段应与INSERT INTO语句中的字段一一对应如正确的写法A;2、 INSERT INTO语句中的各个字段折行后,应缩进并与上一字段左对齐如正确的写法B,或者与INTO关键字左对齐如正确的写法C;3、 SELECT语句中折行后的第一个字段名应缩进并与上一行的第一个字段名左对齐。规那么:INSERT INTO语句中,如果需要对每个字段增加注释,应将每个字段单独列为一行

15、,并在行尾增加注释。例如1: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) - 注释3VALUES ( FieldValue1, FieldValue2, FieldValu

16、e3);或者INSERT INTO T_DEST_TABLE_NAME( DESTFIELDNAME1, - 注释1 DESTFIELDNAME2, - 注释2 DESTFIELDNAME3 - 注释3)VALUES( FieldValue1, FieldValue2, FieldValue3);其他说明:1、 在标准的代码模板中详细给出了各种情况下的范例写法,请编码过程参考;2、 在数据库脚本的编码过程中,请严格按照代码模板进行书写;3、 对于模板中未涉及的情况,应在保证符合上述标准原那么,同时和代码模板中的风格保持一致的前提下,根据实际情况灵活处理。3.3 空格及换行规那么:不允许把多个短

17、语句写在一行中,即一行只写一条语句。例如:v_Variable1 := 1; v_Variable2 := 'abc'应写成:v_Variable1 := 1; v_Variable2 := 'abc'说明:两个赋值语句不能写在一行中,必须分两行写。规那么:相对独立的程序块之间、变量说明之后必须加空行。例如:v_Variable1 := 1;IF v_BeginDate IS NULL THEN v_BeginDate := SYSDATE - 15;END IF;应写成:- 初始化局部变量v_Variable1 := 1; - 判断开始时间IF v_Begin

18、Date IS NULL THEN v_BeginDate := SYSDATE - 15;END IF;说明:两个程序块在逻辑上相对独立,应用空行加以分隔,同时增加注释。建议:建议对超过120字符的语句要分行书写,长表达式应在低优先级操作符处换行,操作符或关键字放在新行之首。划分出的新行应适当地缩进,使排版整齐、语句可读。是否分行应根据实际情况而定,原那么是保证代码整齐、语句可读。分行例如: 120字符 (a * b * c * d) + (e * f) + 应写成: (a * b * c * d) + (e * f) + 说明:1、 加法的优先级低于乘法,因此应在加号处换行;2、 两组乘法

19、虽然在逻辑上会先于加法执行,但显式加上括号使可读性更强。不分行例如:具体内容请参见代码模板“创立初始化数据模板局部,有时初始化数据的语句不分行情况下可读性更强。规那么:调用函数或过程时,如果参数列表超过120字符,应根据逻辑内容进行换行,或者每个参数占用一行。例如:错误的写法: 120字符 P_PROCEDURE(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

20、(i_Param1, - 注释 i_Param2, - 注释 i_Param3, - 注释 o_Param1, - 注释 o_Param2, - 注释 .) - 注释说明:1、 因为前三个为输入参数,后两个为输出参数,因此在第3、4参数之间换行比拟清晰如正确的写法A;2、 有时为了增加注释,可以使每个参数皆占用一行如正确的写法B;3、 参数换行以后与上一行的第一个参数对齐。规那么:双目运算符、操作符前后应以空格分隔,间隔符之后应以空格分隔。例如:v_DateVar:=TO_DATE('2001-01-01 01:30:00','YYYY-MM-DD HH24:MI:SS

21、');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:MI:SS'); 赋值符前后加空格 逗号后面加空格v_IntegerVar1 := v_IntegerVar2 + v_IntegerVar3; 赋值符前后加空格 加号前后加空格IF v_Number > 0 THEN 比拟符号前后加空格建议:不同优先级的操作符混合使用时,建议使用括号进行

22、隔离。例如: a * b + c 应写成: (a * b) + c 说明:使用括号使代码的优先级更加清晰,而且可以防止犯错。建议:SQL语句中存在不同优先级的关系运算符时,建议使用括号。例如:WHERE FIELD1 > 1 AND FIELD2 < SYSDATE OR FIELD3 > SYSDATE + 3应写成:WHERE (FIELD1 > 1 AND FIELD2 < SYSDATE) OR (FIELD3 > SYSDATE + 3)说明:如果SQL语句的条件复杂,很容易出现问题,因此增加括号可以提高可阅读性。3.4 创立表规那么:脚本中的字段

23、名缩进为2个空格。规那么:脚本中字段名称、字段类型、DEFAULT关键字应左对齐,NULL/NOT NULL应右对齐也可以认为就是NULL关键字左对齐。例如:CREATE TABLE T_WF_TABLE_NAME( INTFIELDINTNOT NULL, FLOATFIELDNUMBER(4, 2)DEFAULT 1.23NOT NULL, DATEFIELDDATEDEFAULT SYSDATENULL, VARCHAR2FIELDVARCHAR2(200)NULL)TABLESPACE SERVICE_MAIN_DAT;说明:至于每行中的每个工程之间使用多少个空格没有明确要求,只要求从

24、纵向上各个字段的名称、数据类型、缺省值、是否为空等对齐美观即可。3.5 创立过程/函数/包规那么:脚本中的参数缩进为2个空格。规那么:脚本中的参数名称、数据类型、注释信息应左对齐,IN/OUT/IN OUT关键字左对齐右对齐皆可。例如:CREATE OR REPLACE PROCEDURE P_CSP_PROCEDURENAME( i_DateParamDATE,- 注释 o_IntParamIN OUTINT,- 注释 o_VarcharParam OUTVARCHAR2,- 注释 o_RetCode OUTINT- 注释)或者CREATE OR REPLACE PROCEDURE P_CS

25、P_PROCEDURENAME( i_DateParamDATE,- 注释 o_IntParamIN OUTINT,- 注释 o_VarcharParamOUTVARCHAR2,- 注释 o_RetCodeOUTINT- 注释)说明:至于每行中的每个工程之间使用多少个空格没有明确要求,只要求从纵向上各个参数的名称、数据类型、IN/OUT关键字等对齐美观即可。第4章 命名标准规那么:所有用户自定义的数据库对象名称统一使用形如“对象前缀+下划线+模块名缩写+下划线+对象名称的格式。说明:l 因为所有字符统一使用大写,所以对象名称中可以根据需要再使用下划线进行分隔;l 对象类型前缀建议不要超过三个字

26、符,可参考以下对象前缀表;l 编码时禁止以ORACLE系统对象的前缀作为对象类型前缀,具体请参考ORACLE系统对象使用前缀表;l 模块名缩写建议不要超过三个字符,可参考附录中的常见模块名缩写表;l 数据表字段名称没有前缀;l 对象名称长度不宜超过18个字符。表2 对象前缀表对象类型前缀例如备注表空间命名TableSpaceTBSTBS_CSP_MAIN_DATA表TableTT_CSP_TABLENAMET_PUB_DATA_DICT视图ViewVV_WF_VIEWNAME字段Field无USERNAMECREATE_DATE序列SequenceSQSQ_MS_PLANSCAN索引Index

27、IXIX_WF_SVCINFO_SN如果表名或字段名过长,那么用表名和字段名的缩写表示唯一索引UIXUIX_WF_DEALINFO_SN如果表名或字段名过长,那么用表名和字段名的缩写表示主键Primary KeyPKPK_WF_ADDJSPFILE如果表名过长,那么用表名的缩写表示外键Foreign KeyFKFK_KBS_T1_T2T1为外键所在的表,T2为外键所参照的表簇ClusterCLCL_UMP_TABLENAME如果表名过长,那么用表名的缩写表示触发器TriggerTRTR_MKT_TRIGGERNAME过程Stored ProcedurePP_SAL_PROC_NAME函数Fun

28、ctionFF_PUB_FUNC_NAME包PackagePKGPKG_COM_PKGNAME同义词SynonymsSYNSYN_OTH_CITY保存点SavePointSPTSPT_MOD_SPTNAME类型TypeTYPTYP_SYS_TYPENAME表3 ORACLE系统对象使用前缀表对象类型前缀例如簇ClusterC_C_USER#索引IndexAQ$_HS$_I_SYS_AQ$_MSGTYPE_PRIMARYHS$_GRANTUSER_PKI_AUDITSYS_C00512包PackageDBMS_UTL_DBMS_OUTPUTUTL_FILE序列SequenceAQ$_EVT_HS

29、$_ORA_REPCAT$_SMP_SYSTEM_AQ$_QIDSEQEVT_NOTIFY_SEQHS$_CLASS_CAPS_SORA_TQ_BASE#REPCAT$_REPPROP_KEYSMP_LONG_IDSYSTEM_GRANT同义词SynonymsDEF$_SMP_DEF$_ERRORSMP_JOB_ID表TableAQ$_HS$_DEF$_EVT_REPCAT$_SMP_AQ$_MESSAGE_TYPESHS$_PRIVILEGESDEF$_LOBEVT_OPERATORSREPCAT$_DDLSMP_JOB视图ViewAQ$_SMP_AQ$_DEF$_AQCALLSMP_BLO

30、B规那么:所有用户定义的存储过程或函数中使用的参数、变量、异常等统一采用“小写前缀+下划线+逻辑首字母大写的格式,其中的小写前缀代表参数、变量、类型或异常等的类型,而常量那么统一使用全部大写可根据情况使用下划线进行分隔。小写前缀请参考下表: 表4 参数、变量、常量、异常等前缀表变量类型首字母例如备注函数、过程输入参数ii_BeginDatei_EndDate函数、过程输出、输入输出参数oo_SQL函数、过程局部变量vv_WorkerNo游标变量cc_Cursor自定义常量无SECONDS_OF_DAYPI自定义常量要求全部大写,无前缀。自定义异常exex_UserException记录rr_S

31、erviceInfo自定义类型变量typtyp_NameList规那么:标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家根本可以理解的缩写,防止使人产生误解。建议:较短的单词可通过去掉“元音形成缩写;较长的单词可取单词的头几个字母形成缩写;一些单词有大家公认的缩写,请参考附录中的常用词缩写表。规那么:命名中假设使用特殊约定或缩写,那么要有注释说明。说明:应该在源文件的开始之处,对文件中所使用的缩写或约定,特别是特殊的缩写,进行必要的注释说明。规那么:所有的命名不允许使用拼音,必须使用英文命名。规那么:使用有意义、易于记忆、描述性强、简短及具有唯一性的英文单词。使用下划线要有一致性

32、,要么不用。自己特有的命名风格,要自始至终保持一致,不可来回变化。说明:个人的命名风格,在符合所在工程组或产品组的命名规那么的前提下,才可使用。即命名规那么中没有规定到的地方才可有个人命名风格。规那么:对于变量命名,禁止取单个字符如i、j、k.,建议除了要有具体含义外,还能说明其变量类型、数据类型等。形如i、j、k的变量只允许作为局部循环变量。说明:变量,尤其是局部变量,如果用单个字符表示,很容易敲错如i写成j,而编译时又检查不出来,有可能为了这个小小的错误而花费大量的查错时间。规那么:除非必要,不允许使用数字或较奇怪的字符来定义标识符。例如:如下命名,使人产生疑惑。DECLARE temp_

33、0_TEST VARCHAR2(10);规那么:用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。例如:Start <-> Finish启动 <-> 完成First <-> Last第一个 <-> 最后一个Prior <-> Next前一个 <-> 后一个Add <-> Remove增加 <-> 删除Create <-> Destroy创立 <-> 析构Get <-> Set获取 <-> 设置Increment <-> Decrem

34、ent增量 <-> 减量Lock <-> UnLock加锁 <-> 解锁Open <-> Close翻开 <-> 关闭第5章 注释标准建议:存储过程/函数脚本代码有效注释量应该在20以上。说明:注释的原那么是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。规那么:在数据库脚本文件头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、修改日志等,头文件的注释中还应有函数或过程功能简要说明。例如:- File Name: 该脚本文件的文件名- Aut

35、hor: 该脚本文件的作者姓名与工号- Version: 该脚本文件的版本号- Date: 该脚本文件的最后更新日期- Copyright: 该脚本文件的版权信息- Description: 该脚本文件的描述信息- Usage: 简要描述该脚本的使用/加载方法- Function List: 该脚本文件提供对象、函数、过程的列表- Comments: 该脚本文件的注释信息- History: 该脚本文件的维护历史信息- 1. Date: 修改日期,格式为YYYY-MM-DD- Author: 修改人姓名与工号- Modification: 修改说明- 2. .-说明:格式内容请参见代码模板文件

36、头。规那么:函数/存储过程头部应进行注释,列出:功能说明、设计人、编码人、创立日期、修改记录、调用关系可选等,输入参数/输出参数/返回值的说明直接添加到参数后面。例如:CREATE OR REPLACE FUNCTION F_CSP_FUNCTIONNAME/* Description: 该函数的功能说明 Author: 姓名 工号 Date: YYYY-MM-DD Version: 版本 Caller: 调用者 Callee: 被调用者 Comments: 注释信息包括产生异常的说明 History: 1.Date: 修改日期,格式为YYYY-MM-DDAuthor: 修改人姓名与工号Mod

37、ification: 修改说明 2. .*/( i_DateParamDATE,- 输入参数注释。包括含义、值域等。 o_IntParamIN OUTVARCHAR2,- 输入输出参数注释。 o_FloatParam OUTINT- 输出参数描述。) RETURN INT- 返回值。AS规那么:边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。规那么:注释的内容要清楚、明了,含义准确,防止注释二义性。说明:错误的注释不但无益反而有害。规那么:防止在注释中使用缩写,特别是非常用缩写。说明:在使用缩写时或之前,应对缩写进行必要的说明。规那么:单行注释符“-

38、后必须加上一个空格。规那么:注释应与其描述的代码相近,对代码的注释应放在其上方或右方对单条语句的注释相邻位置,不可放在下面,如放于上方那么需与其上面的代码用空行隔开。例如:BEGIN - i_DateParam必须早于当前时间 IF i_DateParam >= SYSDATE THEN RETURN 1; END IF; END;规那么:注释与所描述内容进行同样的缩进。说明:可使程序排版整齐,并方便注释的阅读与理解。规那么:注释与其上的代码用空行隔开。建议:对变量的定义和分支语句条件分支、循环语句等建议给出注释。说明:这些语句往往是程序实现某一特定功能的关键,对于维护人员来说,良好的注

39、释帮助更好的理解程序,有时甚至优于看设计文档。规那么:不允许在一行代码或表达式的中间插入注释。说明:不应在代码或表达中间插入注释,否那么容易使代码可理解性变差。规那么:通过对函数或过程、变量、结构等适宜的命名以及合理地组织代码的结构,使代码成为自注释的。说明:清晰准确的函数、变量等的命名,可增加代码可读性,并减少不必要的注释。规那么:在代码的功能、意图层次上进行注释,提供有用、额外的信息。说明:注释的目的是解释代码的目的、功能和采用的方法,提供代码以外的信息,帮助读者理解代码,防止没必要的重复注释信息。例如:如下注释意义不大- i_RetCode = 0IF i_RetCode = 0 THE

40、N而如下的注释那么给出了额外有用的信息。- 流程传入的标志为发送成功IF i_RetCode = 0 THEN第6章 常用语法6.1 变量声明规那么:代码中声明与表的字段相对应的变量时,应保证变量名和字段名相同。说明:这样要求的目的是增强可读性。例如:DECLARE v_DateField T_TABLENAME.DATEFIELD%TYPE;BEGIN SELECT DATEFIELD INTO v_DateField FROM T_TABLENAME WHERE ROWNUM = 1;END;规那么:代码中声明与表的字段相对应的变量时,对类型的定义需要使用%TYPE方式。说明:这样表结构的

41、变动不会影响存储过程,防止表结构变更后出现变量长度或类型不一致的问题。6.2 返回值规那么:函数的返回值定义应遵从以下标准:成功出口返回0,失败出口返回大于0整数。过程中定义的用于返回错误码的OUTPUT参数,其定义应遵从以下标准:成功出口返回0,失败出口返回非0整数。6.3 符号* 规那么:脚本中不允许出现“*的用法,必须用实际的字段名代替,INSERT语句必须指定要插入的字段名。例如:1、游标定义错误用法:CURSOR c_CursorName IS SELECT * FROM TABLENAME .正确用法:CURSOR c_CursorName IS SELECT FIELD1, FI

42、ELD2, . FROM TABLENAME .2、INSERT 语句错误用法:INSERT INTO TABLENAME VALUES .正确用法:INSERT INTO TABLENAME (FIELD1, FIELD2, .) VALUES .6.4 包的使用建议:ORACLE的包类似C+中的Class,有包头和包体两局部组成;包能够把相关的功能封装性在一个包中,包里面里可以有函数和过程。PACKAGE与PROCEDURE和FUNCTION的优点是封装性比拟好;在开发过程中,可以把功能点紧密相关的PROCEDURE、FUNCTION封装在一个包里面。在对包体进行编译时,调用该包的存储过程

43、不会失效。6.5 绑定变量规那么:使用绑定变量的SQL语句,能使用绑定变量方式的业务逻辑下不允许使用绑定常量实现。说明:在存储过程拼SQL语句作为动态SQL执行时,尤其需要注意。例如:错误用法:v_SQL := 'DELETE FROM 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'EX

44、ECUTE IMMEDIATE v_SQL USING SYSDATE, v_ID;规那么:为提升性能,减少循环的开销,可以使用批量绑定。说明:下面例如中的UPDATE语句可以一次将多条记录进行更新,而防止了通过使用循环同一条SQL执行屡次。例如:CREATE OR REPLACE PROCEDURE P_CSP_TEST/* Description: 根据输入的多个工单流水号,更新对应的SERVICECLASSID值 Author: 姓名 工号 Date: YYYY-MM-DD Version: 版本 Caller: 调用者 Callee: 被调用者 Comments: 注释信息 Histo

45、ry: 1.Date: 修改日期,格式为YYYY-MM-DDAuthor: 修改人姓名与工号Modification: 修改说明 2. .*/( i_SerialNos VARCHAR2, - 一次输入多个工单流水号以''分隔' 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

46、.9999 LOOP - 把输入参数的值取出存放在数组v_ArrSerial中 EXIT WHEN GetParamStr(i_SerialNos, '', i, v_ArrSerial(i) <> 0; END LOOP; - 根据数组中的工单流水号批量更新 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;EXCEP

47、TION WHEN OTHERS THEN ROLLBACK; o_Ret := 1;END;6.6 异常处理规那么:函数/过程中应该有异常处理的代码,除非需要将任何可能的异常都向上抛出。说明:不管代码逻辑是否简单,只要有可能会抛出异常,函数/过程块就应该包括异常处理代码。详见代码模板。规那么:如果需要的话,可以在异常处理局部将异常继续向上抛出给调用者。说明:如果有些异常是预料可能产生,而且脚本需要根据是否有异常来做不同的逻辑处理,这种情况可以在异常处理局部将该异常进行处理,但可能有些意料之外的异常,需要继续向上抛出,便于调用者了解脚本执行是否成功,以便于调用者作下一步的处理如写错误日志等操作

48、。规那么:如果需要自定义异常,必须在异常处理块中对其进行处理。说明:如果自定义了异常,却没有相应的代码进行处理,那么就应该去掉该异常的定义。规那么:在对容错性要求比拟高的情况下,对异常块中的代码还需要判断是否可能触发异常,必要的时候应使用嵌套的异常。说明:在异常处理局部中的写日志之前,如果有事务,一定要先ROLLBACK;异常块中写日志、向表中插入一条初始化记录等语句也可能失败,对这些代码必要时也应该增加异常保护,即使用嵌套的异常处理。6.7 事务控制规那么:在任何出口之前,只要存在事务未结束,必须提交或者回滚,除非有特殊设计考虑。说明:存储过程在每个出口前,如果启动了事务必须结束所有事务,以

49、提交COMMIT或回滚ROLLBACK来结束事务,否那么可能会导致表锁等严重问题;如果在存储过程中,没有启动事务,就不必执行COMMIT或ROLLBACK,否那么多余的ROLLBACK或COMMIT操作将增加数据库的额外开销。规那么:ORACLE的事务是串行的,嵌套调用中内层存储过程的提交会导致外层的存储过程事务被一并提交;诸如生成流水号这类存储过程应使用独立事务,否那么在产生流水号时就将之前的业务逻辑操作提交,而后续的操作不能保证在一个事务中。例如现有系统中一个工单循环派给多个部门时,循环体内产生流水号,如最后一个派单失败时回滚操作根本就不能回撤所有操作,导致事务一致性被破坏。建议:尽量分解大事务,事务的大小应视系统的性能和应用的具体情况而定,过多过小的事务造成重做日志同步的等待,比方要往一个表插入100万条记录,如果每条记录提交

温馨提示

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

评论

0/150

提交评论