Oracle数据库命名编码规范doc 27页.docx

上传人:b****6 文档编号:6966735 上传时间:2023-01-13 格式:DOCX 页数:26 大小:31.49KB
下载 相关 举报
Oracle数据库命名编码规范doc 27页.docx_第1页
第1页 / 共26页
Oracle数据库命名编码规范doc 27页.docx_第2页
第2页 / 共26页
Oracle数据库命名编码规范doc 27页.docx_第3页
第3页 / 共26页
Oracle数据库命名编码规范doc 27页.docx_第4页
第4页 / 共26页
Oracle数据库命名编码规范doc 27页.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

Oracle数据库命名编码规范doc 27页.docx

《Oracle数据库命名编码规范doc 27页.docx》由会员分享,可在线阅读,更多相关《Oracle数据库命名编码规范doc 27页.docx(26页珍藏版)》请在冰豆网上搜索。

Oracle数据库命名编码规范doc 27页.docx

Oracle数据库命名编码规范doc27页

Oracle数据库命名编码规范(doc27页)

文件标识:

QD-30-08密级:

内部

版本号:

Ver1.0

 

大庆金桥软件开发作业体系

Oracle数据库命名编码规范

 

变更历史

操作

责任人

日期

版本

变更内容

创建

李富华

2010-04-20

创建文档

编辑

周强

2010-04-21

修改文档

1.文档介绍4

1.1文档目的4

1.2文档范围4

1.3定义4

1.4参考资料4

2.命名规范4

2.1一般规则4

2.2对象命名汇总表5

3.编码规范6

3.1一般性规定6

3.2CREATE语句7

3.3SELECT语句7

3.4INSERT语句8

3.5UPDATE语句8

3.6DELETE语句9

3.7游标语句9

3.8IF语句9

3.9简单循环语句11

3.10FOR循环语句11

3.11WHILE循环语句11

3.12程序块规范12

3.13语法规范12

4.设计规范14

4.1一般表设计14

4.2特殊表设计原则15

4.3索引设计原则15

4.4完整性设计原则15

4.5触发器15

4.6视图设计15

4.7性能优化16

5.书写规范20

5.1缩进风格20

5.2空格及换行20

6.注释说明21

6.1一般性注释21

6.2函数文本注释21

7.异常规范22

7.1pl/sql异常规范22

7.2后台验证异常信息规范23

8.附录23

8.1附一开发工具23

8.2附二预定义异常24

8.3附三范式25

8.3.1第一范式25

8.3.2第二范式25

8.3.3第三范式25

8.3.4Boyce-Codd范式26

8.3.5第四范式26

8.3.6第五范式26

8.3.7反规范化26

 

1.文档介绍

1.1文档目的

本文档用于指导开发设计人员对Oracle数据库进行设计和编码。

使用统一的命名和编码规范,使数据库对象命名及编码风格标准化,可增加程序的可读性,增强系统的可维护性,提高软件的质量。

本文档仅仅针对Oracle数据库做的规范,对其他数据库不具有指导意义。

1.2文档范围

本规范适用于公司范围内所有以Oracle作为后台数据库的应用系统和项目开发工作。

对公司2010年以前用Oracle数据库开发的项目不做限制。

1.3定义

1.4参考资料

2.命名规范

2.1一般规则

Oracle中的各种数据对象,包括实例、数据库、表空间、表、视图、存储过程、函数、解发器等的命名都要遵循Oracle的标准命名规则:

1)以字符打头,30个字符以内,名称超过长度的情况下适当采用缩写。

2)只能包含A-Z,a-z,0-9,_。

3)不能和同一个表空间下的其他对象重名。

4)不能是Oracle服务器的保留字。

5)数据对象尽量不要使用缩写;如要缩写最好使用容易看懂的缩写。

2.2对象命名汇总表

对象

对象名

前缀

范例

描述

表(table)

t_

t_user

表名长度原则上不超过25个字符;表、视图、字段名中不出现复数,创建表必须要注释,comments必须要填写。

视图(view)

v_

v_user

如果表名或字段名过长,则用表名或字段名的缩写。

序列(sequence)

s_

s_user

一般索引(normalindex)

i_

_

i_user_username

field:

字段名,遇上长字段名可采用缩写

唯一索引(uniqueindex)

i_u_

_

i_u_user_birthday

主键(primarykey)

pk_

_

pk_user_userid

外键(foreignkey)

fk_

__

fk_student_user_userid

簇(cluster)

cl__

cl_user_student

触发器(triger)

tr_i_<功能>

tr_u_<功能>

tr_d_<功能>

tr_iud_<功能>

tr_i_add_user_birthday

i:

insert

u:

update

d:

delete

存储过程(procedure)

p_i_<功能>

p_u_<功能>

p_d_<功能>

p_s_<功能>

p_i_user_birthday

函数(function)

f_<功能>

f_get_username_by_userid

包及包体(package&packagebody)

pkg_<功能>

pkg_user_info

类及类体(type&typebody)

type_<功能>

type_user_class

同义词(synonym)

inv_

inv_user

保存点(savepoint)

save_

save_

表的保存点

事务的保存点

事务(transaction)

trans_

trans_insert_userinfo

字段(field)

create_date

单词小写,中间用下划线隔开,字段必须要注释,comments必须要填写。

游标(cursor)

cur_<名称>

cur_user_info

数据库链接(databaselink)

link_<服务器名>_<数据库名>

若远程服务器名和数据库名一致,采用link_<数据库名>

用户及角色

3.编码规范

3.1一般性规定

1、sql语句中的所有表名、字段名全部小写,系统保留字、内置函数名、sql保留字大写。

【推荐】

2、连接符OR、IN、AND、以及=、<=、>=等前后各加上一个空格。

当语句中出现括号时,括号的两边不留空格。

3、“不等于”统一使用"<>"。

虽然"!

="和"<>"是等价的,为了统一,不等于一律使用"<>"表示。

4、对较为复杂的sql语句加上注释,说明算法、功能。

5、使用空行将逻辑相关的代码段之间分隔开。

6、程序块采用缩进风格书写,保证代码清晰易读,风格一致,缩进格数统一为2个。

必须使用空格,不允许使用TAB键,以免用不同的编辑器阅读程序时,因TAB键所设置的空格数目不同而造成程序布局不整齐。

7、一行有多列,超过80个字符时,基于列对齐原则,采用下行缩进。

8、where子句书写时,每个条件占一行,保留字或者连接符放到行的最后面,含有键的条件放到其他条件的前面。

3.2CREATE语句

CREATETABLEt_dksz(

YHBSVARCHAR2(20)NOTNULL,

ZHGXDATE,

DKKHDVARCHAR2(24),

CONSTRAINTpk_dksz_yhbsPRIMARYKEY(YHBS)

3.3SELECT语句

查询语句采用以下原则编写(可最大化重用共享池中的SQL语句,提高应用程序性能):

(1)由SELECT开头,后跟一个显示查询结果的列表;【推荐】

(2)语句中嵌入逗号时,在逗号后面加一空格,当逗号是最后一个字符时,把它放在本行;

(3)由FROM开头,后跟一个或多个获取数据所涉及的表,如果后面跟多个表,关键字右对齐;【推荐】

(4)由WHERE开头,后跟一个或多个确定所需值的条件,如果后面有多个条件,关键字右对齐;【推荐】

(5)由GROUPBY开头,后跟一个或多个表列名,通过这些列以对查询结果进行汇总,关键字右对齐;【推荐】

(6)由ORDERBY开头,后跟一个或多个表列名,通过这些列以对查询结果进行排序,关键字右对齐;【推荐】

(7)当语句中出现括号时,括号的两边不留空格;

(8)在SQL语句使用运算符时,操作两边应各留一个空格;

(9)每个部分分行编写,将每一行的第一个关键字与第一行的SELECT尾部对齐;

例如:

SELECTcol1,col2,col3

FROMtable1

WHEREcol1>col2

GROUPBYcol1,col2

ORDERBYcol1;

SELECTcol1,col2,col3,col4,col5,col6,

col7,col8,col9,col10

FROMsb_sbqkxx,sb_bb011101

WHEREsb_sbqkxx.czwdbh=sb_bb.czwdbh

ANDsb_sbqkxx.swdjbh=avc_swdjbh

ANDsb_sbqkxx.sbsssq=avc_sbsssq;

 

3.4INSERT语句

✓关键字用大写,列名和表名采用小写;【推荐】

✓语句中嵌入逗号时,在逗号后面加一空格,当逗号是最后一个字符时,把它放在本行;

✓当语句的同一部分要延续到下一行时,按下列格式排列:

✓当语句中出现括号时,括号的两边不留空格。

格式如下:

【推荐】

INSERTINTO<要插入的表名>

(<列1>,<列2>,..,<列n-1>,<列n>)

VALUES

(<列1值>,<列2值>,..,<列n-1值>,<列n值>)

例如:

insertintosm_user

(user_id,user_name,login_name)

values

(p_user_id,p_user_name,p_login_name)

insertintosm_duty_bak

(duty_id,duty_name,created_by,creation_date,last_updated_by,

last_update_date,disable_date)

select

duty_id,duty_name,created_by,creation_date,last_updated_by,

last_update_date,disable_date

fromsm_duty

whereduty_id=:

duty_id

3.5UPDATE语句

✓关键字右对齐;

格式如下:

【推荐】

UPDATE<要更新的表名>

SET<要更新的列>=<列值>,

<要更新的列>=<列值>,

<要更新的列>=<列值>

3.6DELETE语句

格式如下:

【推荐】

DELETEFROMtable1

WHEREcol1='?

?

?

'

3.7游标语句

格式如下:

【推荐】

程序中使用显示游标。

格式如下

OPENcur_name;

LOOP

FETCHcur_into…;

EXITWHENcur_name%notfound;

<处理语句>…

ENDLOOP;

CLOSEcur_name;

3.8IF语句

条件执行语句IF…ELSE按以下格式编写:

【推荐】

IF<条件表达式>THEN

<一条或多条语句>

[ELSE(或ELSIF<条件表达式>)THEN

<一条或多条语句>

ENDIF;

✓在IF…THEN和ELSE(或ELSIF)及ELSE…THEN和ENDIF间可包含一条或多条PL/SQL语句,而不需要加BEGIN和END

✓IF…ELSE…ENDIF语句可以嵌套;

✓注意ELSIF的写法;

✓if后的条件要用括号括起来,括号内每行最多两个条件。

例如:

if(v_count=1orv_count=2or

v_count=5orv_count=6)then

selectsysdate

intov_date

fromdual;

endif;

✓减少控制语句的检查次数,如在else(if..else)控制语句中,对最常用符合条件,尽量往前被检查到。

例如:

以下例如不符合规范(假设v_count=1条件大数情况会被满足)

if(v_count=0)then

null;

elsif(v_count=1)then

null;

endif;

应如下书写:

if(v_count=1)then

null;

elsif(v_count=0)then

null;

endif;

✓尽量避免使用嵌套的if语句,在这种情况应使用多个if语句来判断其可能。

例如:

以下例如不符合规范

ifv_count=0then

ifv_flag=0then

null;

else

null;

endif;

elsev_count=1then

ifv_flag=0then

null;

else

null;

endif;

endif;

应如下书写:

if(v_count=0)and(v_flag=0)then

null;

elsif(v_count=0)and(v_flag=1)then

null;

elsif(v_count=1)and(v_flag=0)then

null;

elsif(v_count=1)and(v_flag=1)then

null;

endif;

3.9简单循环语句

LOOP

<零条或多条语句>

EXITWHEN<条件表达式>

<零条或多条语句>

ENDLOOP;

3.10FOR循环语句

FOR变量IN[变量取值范围]

LOOP

<一条或多条语句>

ENDLOOP;

3.11WHILE循环语句

WHILE<条件表达式>

LOOP

<一条或多条语句>

ENDLOOP;

3.12程序块规范

在sql代码块中尽量使用begin...end语句块,提高代码可读性。

对于触发器、存储过程、函数等带名的程序块,要使用块结束标识。

CREATEORREPLACEPROCEDUREp_get_userinfo

BEGIN

ENDp_get_userinfo;/*此处的过程名p_get_userinfo是可选的,规范要求写上,与块开始的CREATE相对应*/

3.13语法规范

✓避免隐式的数据类型转换。

说明:

在书写代码时,必须确定表的结构和表中各个字段的数据类型,特别是书写查询条件时的字段就更要注意了。

例如:

以下代码不符合规范,status_type是number型数据.

select

wdj.wip_entity_id

from

wip.wip_discrete_jobswdj

where

wdj.status=‘3’;

应如下书写:

select

wdj.wip_entity_id

from

wip.wip_discrete_jobswdj

where

wdj.status=3;

✓不要将空的变量值直接与比较运算符(符号)比较。

如果变量可能为空,应使用isnull或isnotnull或nvl函数进行比较。

例如:

以下代码不符合规范

ifv_user_name=nullthen

dbms_output.put_line(‘usernameisnull’);

endif;

应该如下书写:

ifv_user_nameisnullthen

dbms_output.put_line(‘usernameisnull’);

endif;

✓对于非常复杂的sql(特别是多层嵌套,带子句或相关的查询),应该先考虑是否设计不当引起的,对于复杂的一些sql可以考虑使用程序实现,原则上遵循一句话只做一件事情。

✓尽可能地使用相关表字段的类型定义,形如%type、%rowtype。

✓存储过程中变量的声明应集中在as和begin关键字之间,不允许在代码中随意定义变量,定义变量时,完成相同功能模块的变量应放在一起,与不同模块的变形量应空行隔开,增加代码的可读性。

✓orderby后面字段不唯一时分页会出现问题,分页时如果orderby后面的字段不唯一,一定要让orderby唯一,最佳方案是增加一pk,如实在没办法则可以追加rowid,orderby后尽量避免使用rowid。

✓使用varchar2代替varchar类型。

✓当存储过程有多个分支返回时,若有事务,需确保各个分支都结束了事务。

✓in、out参数应按类别分开书写,不要交叉,对于out参数,特别是nesttable、record,尽量都带上nocopy,提高程序的运行效率。

✓聚集函数max、min、sum在没有记录得符合查询条件的情况下返回null,不会产生no_data_found异常。

✓原则上不要使用动态sql,如果非得使用运态sql,须绑定变量。

【推荐】

✓尽量不要使用子函数方式实现存储过程,应分别定义。

【推荐】

✓代码中不建议使用goto语句。

【推荐】

✓确保所的变量和参数都使用到。

【推荐】

✓确保变量和参数在类型和长度与表数据列类型和长度相匹配。

如果与表数据列宽度不匹配,则当较宽或较大的数据传进来时会产生运行异常。

例如:

如fnd_users表user_name字符宽为50,当用户名大于10时会报错。

declare

v_user_namevarchar2(10);

begin

selectfu.user_name

intov_user_name

fromfnd_userfu

wherefu.user_id=p_user_id;

end;

✓当一个PL/SQL或SQL语句中涉及到多个表时,始终使用别名来限定字段名,这使其它人阅读起来更方便,避免了含议模糊的引用,其中能够别名中清晰地判断出表名。

别名命名时,尽量避逸使用无意义的代号a、b、c…,而应该有意义(如表system_items_b对应别名为msi,po_headers_all别名对应为pha)。

例如:

以下编码不符合规范:

select

wip_entity_name,a.wip_entity_id,a.date_released

from

wip.wip_entitiesb,

wip.wip_discrete_jobsa

where

b.wip_entity_id=a.wip_entity_idand

a.status_type=3and

a.date_released>trunc(sysdate)

应如下书写:

selectwe.wip_entity_name,wdj.wip_entity_id,wdj.date_released

fromwip.wip_entitieswe,

wip.wip_discrete_jobswdj

wherewe.wip_entity_id=wdj.wip_entity_id

andwdj.status_type=3

andwdj.date_released>trunc(sysdate)

4.设计规范

4.1一般表设计

✓表空间设计,原则上表空间名与schema名一致,其索引所在空间为schemaname+index。

如:

schema为INV,则默认的表空间应该为INV,所对应的索引空间为INVINDEX

✓tablespace——每个表在创建时候,必须指定所在的表空间,不要采用默认表空间,以防止表建立在system空间上,导致性能问题。

对于事务比较繁忙的数据表,必须存放在在该表专用空间中。

✓根据性能需要,可以适当可曾加冗余;

4.2特殊表设计原则

✓分区表——对于数据量比较大的表,根据表数据的属性进行分区,以得到较好的性能。

如果表按某些字段进行增长,则采用按字段值范围攻进行分区;如果表按某个字段的几个关键值进行分布,则采用列表分区;对于静态表,则采用hash分区或列表分区;在范围分区中,如果数据按某关键字段均衡分由,则采用子分区的复合分区法。

✓在分区表中不建议使用全局索引,因为trunc分区时会导致全局索引失效,造成难以维护。

4.3索引设计原则

✓每个索引在创建时,必须指定表空间,不要采用默认表空间,以防止索引建立在system空间和非索引专用空间,以减少IO冲突,提高性能。

4.4完整性设计原则

✓主键约束——原则上所有的数据表都要有主键。

对于数据量比较大的表,要求指定索引字段。

✓外键关联——对于关联两个表字段,一般应该分别建立主键、外键。

实际是否建立外键,根据对数据完整性的要求决定。

为了提高性能,对于数据量较大的表要求对外键建立索引。

对于有要求级联删除属性的外键,必须指定ondeletecascade.

✓Null值——对于字段能否为null,应该在sql建表脚本中明确指定,不应该使用缺省。

由于null值在参加任何计算时,结果均为null,所以在程序中必须用nvl()函数把可能为null值的字段或变量转换非null的默认值。

✓Check条件——对于字段有检查性约束,需指定check原则。

4.5触发器

触发器是一种特殊的存储过程,通过数据表的DML操作而触发执行,其作用为确保数据的完整性和一致性不被破坏而创建,实现数据的完整性约束。

说明:

触发器的before或after事务属性的选择时候,对表操作的事务属性必须与应用程序保持一致,以避免死锁发生,在大型导入表中,尽量避免使用触发器。

✓在系统中不要使用过多的触发器。

4.6视图设计

✓尽量使用简单的视图,避免使用复杂的视图。

简单视图:

数据来自单个表,且无分组(distinct/groupby)、无函数。

复杂视图:

数据来自多个表,或有分组、有函数。

4.7性能优化

✓避名频繁commit,尤其是把commit写在循环体中每次循环都进行commit。

✓使用绑定变量,避免常量的直接引用。

例如:

以下书写不符合本规范.

insertintosm_users(user_id,user_name,created_by,creation_date)values

(1,’Tang’,-1,sysd

展开阅读全文
相关搜索

当前位置:首页 > 考试认证 > 交规考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1