Oracle数据库命名编码规范doc 27页Word文件下载.docx
- 文档编号:19988216
- 上传时间:2023-01-13
- 格式:DOCX
- 页数:26
- 大小:31.49KB
Oracle数据库命名编码规范doc 27页Word文件下载.docx
《Oracle数据库命名编码规范doc 27页Word文件下载.docx》由会员分享,可在线阅读,更多相关《Oracle数据库命名编码规范doc 27页Word文件下载.docx(26页珍藏版)》请在冰豆网上搜索。
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_<
table>
t_user
表名长度原则上不超过25个字符;
表、视图、字段名中不出现复数,创建表必须要注释,comments必须要填写。
视图(view)
v_<
v_user
如果表名或字段名过长,则用表名或字段名的缩写。
序列(sequence)
s_<
s_user
一般索引(normalindex)
i_<
_<
field>
i_user_username
field:
字段名,遇上长字段名可采用缩写
唯一索引(uniqueindex)
i_u_<
i_u_user_birthday
主键(primarykey)
pk_<
pk_user_userid
外键(foreignkey)
fk_<
father_table>
fk_student_user_userid
簇(cluster)
cl_<
table1>
table2>
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_<
transaction>
表的保存点
事务的保存点
事务(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
应如下书写:
if(v_count=1)then
elsif(v_count=0)then
null;
✓尽量避免使用嵌套的if语句,在这种情况应使用多个if语句来判断其可能。
以下例如不符合规范
ifv_count=0then
ifv_flag=0then
else
endif;
elsev_count=1then
if(v_count=0)and(v_flag=0)then
elsif(v_count=0)and(v_flag=1)then
elsif(v_count=1)and(v_flag=0)then
elsif(v_count=1)and(v_flag=1)then
3.9简单循环语句
零条或多条语句>
EXITWHEN<
3.10FOR循环语句
FOR变量IN[变量取值范围]
3.11WHILE循环语句
WHILE<
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’;
wdj.status=3;
✓不要将空的变量值直接与比较运算符(符号)比较。
如果变量可能为空,应使用isnull或isnotnull或nvl函数进行比较。
以下代码不符合规范
ifv_user_name=nullthen
dbms_output.put_line(‘usernameisnull’);
应该如下书写:
ifv_user_nameisnullthen
✓对于非常复杂的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
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>
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Oracle数据库命名编码规范doc 27页 Oracle 数据库 命名 编码 规范 doc 27