(O管理)DO数据库命名编码
规范
文件标识:QD-30-08 密级:内部
版本号:
大庆金桥软件开发作业体系
Oracle数据库命名编码规范
变更历史
操作 责任人 日期 版本 变更内容
创建 李富华 2010-04-20 无 创建文档
编辑 周强 2010-04-21 无 修改文档
目录
1.文档介绍 4
文档目的 4
文档范围 4
定义 4
参考资料 4
2.命名规范 4
一般规则 4
对象命名汇总表 5
3.编码规范 6
一般性规定 6
语句 7
语句 7
语句 8
语句 8
语句 9
游标语句 9
语句 9
简单循环语句 11
循环语句 11
循环语句 11
程序块规范 12
语法规范 12
4.设计规范 14
一般表设计 14
特殊表设计原则 15
索引设计原则 15
完整性设计原则 15
触发器 15
视图设计 15
性能优化 16
5.书写规范 20
缩进风格 20
空格及换行 20
6.注释说明 21
一般性注释 21
函数文本注释 21
7.异常规范 22
22
后台验证异常信息规范 23
8.附录 23
附一 开发工具 23
附二 预定义异常 24
附三 范式 25
第一范式 25
第二范式 25
第三范式 25
-Codd范式 26
第四范式 26
第五范式 26
反规范化 26
1.文档介绍
文档目的
本文档用于指导开发设计人员对 Oracle数据库进行设计和编码。使用统一的命名和
编码规范,使数据库对象命名及编码风格标准化,可增加程序的可读性,增强系统的可
维护性,提高软件的质量。
本文档仅仅针对 Oracle数据库做的规范,对其他数据库不具有指导意义。
文档范围
本规范适用于公司范围内所有以 Oracle作为后台数据库的应用系统和项目开发工
作。对公司 2010年以前用 Oracle数据库开发的项目不做限制。
定义
无
参考资料
2.命名规范
一般规则
Oracle中的各种数据对象,包括实例、数据库、表空间、表、视图、存储过程、函
数、解发器等的命名都要遵循 Oracle的标准命名规则:
1) 以字符打头,30个字符以内,名称超过长度的情况下适当采用缩写。
2) 只能包含 A-Z,a-z,0-9,_。
3) 不能和同一个表空间下的其他对象重名。
4) 不能是 Oracle服务器的保留字。
5) 数据对象尽量不要使用缩写;如要缩写最好使用容易看懂的缩写。
对象命名汇总表
对象
对象名 前缀 范例 描述
表(table)
t_<table>
t_user 表名长度原则上不超过25
个字符;表、视图、字段
名中不出现复数,创建表
必须要注释,comments必
须要填写。
视图(view) v_<table> v_user 如果表名或字段名过长,
则用表名或字段名的缩写。
序列(sequence) s_<table> s_user
一般索引
(normalindex)
i_<table>_<field> i_user_userna
me
field:字段名,遇上
长字段名可采用缩写
唯一索引
(uniqueindex)
i_u_<table>_<field> i_u_user_birt
hday
主键(primarykey) pk_<table>_<field>
pk_user_useri
d
外键(foreignkey) fk_<table>_<father_
table>_<field>
fk_student_us
er_userid
簇(cluster)
cl_<table1>_<table2
>
cl_user_stude
nt
触发器(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_birt
hday
函数(function) f_<功能> f_get_usernam
e_by_userid
包及包体
(package&package
body)
pkg_<功能> pkg_user_info
类及类体
(type&typebody)
type_<功能> type_user_cla
ss
同义词(synonym) inv_<table> inv_user
保存点(savepoint)
save_<table>
save_<transaction>
表的保存点
事务的保存点
事务(transaction) trans_<transaction>
trans_insert_
userinfo
字段(field)
create_date 单词小写,中间用下划线
隔开,字段必须要注释,
comments必须要填写。
游标(cursor) cur_<名称> cur_user_info
数据库链接
(databaselink) link_<服务器名>_<数
据库名>
若远程服务器名和数据
库名一致,采用 link_<数
据库名>
用户及角色
3.编码规范
一般性规定
1、sql语句中的所有表名、字段名全部小写,系统保留字、内置函数名、sql保留字大
写。【推荐】
2、连接符 OR、IN、AND、以及=、<=、>=等前后各加上一个空格。当语句中出现括号
时,括号的两边不留空格。
3、“不等于”统一使用"<>"。虽然"!="和"<>"是等价的,为了统一,不等于一律使用"<>"
表示。
4、对较为复杂的 sql语句加上注释,说明算法、功能。
5、使用空行将逻辑相关的代码段之间分隔开。
6、程序块采用缩进风格书写,保证代码清晰易读,风格一致,缩进格数统一为 2个。
必须使用空格,不允许使用 TAB键,以免用不同的编辑器阅读程序时,因 TAB键所
设置的空格数目不同而造成程序布局不整齐。
7、一行有多列,超过 80个字符时,基于列对齐原则,采用下行缩进。
8、where子句书写时,每个条件占一行,保留字或者连接符放到行的最后面,含有键
的条件放到其他条件的前面。
语句
CREATETABLEt_dksz(
YHBSVARCHAR2(20)NOTNULL,
ZHGXDATE,
DKKHDVARCHAR2(24),
CONSTRAINTpk_dksz_yhbsPRIMARYKEY(YHBS)
)
语句
查询语句采用以下原则编写(可最大化重用共享池中的 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
=
=avc_swdjbh
=avc_sbsssq;
语句
关键字用大写,列名和表名采用小写;【推荐】
语句中嵌入逗号时,在逗号后面加一空格,当逗号是最后一个字符时,把它放在本
行;
当语句的同一部分要延续到下一行时,按下列格式排列:
当语句中出现括号时,括号的两边不留空格。
格式如下:【推荐】
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
语句
关键字右对齐;
格式如下:【推荐】
UPDATE<要更新的表名>
SET<要更新的列>=<列值>,
<要更新的列>=<列值>,
<要更新的列>=<列值>
语句
格式如下:【推荐】
DELETEFROMtable1
WHEREcol1='???'
游标语句
格式如下:【推荐】
程序中使用显示游标。格式如下
OPENcur_name;
LOOP
FETCHcur_into…;
EXITWHENcur_name%notfound;
<处理语句>…
ENDLOOP;
CLOSEcur_name;
语句
条件执行语句 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;
简单循环语句
LOOP
<零条或多条语句>
EXITWHEN<条件表达式>
<零条或多条语句>
ENDLOOP;
循环语句
FOR变量 IN[变量取值范围]
LOOP
<一条或多条语句>
ENDLOOP;
循环语句
WHILE<条件表达式>
LOOP
<一条或多条语句>
ENDLOOP;
程序块规范
在 sql代码块中尽量使用 begin...end语句块,提高代码可读性。
对于触发器、存储过程、函数等带名的程序块,要使用块结束标识。
如
CREATEORREPLACEPROCEDUREp_get_userinfo
…
BEGIN
…
ENDp_get_userinfo;/*此处的过程名 p_get_userinfo是可选的,规范要求写上,
与块开始的 CREATE相对应*/
语法规范
避免隐式的数据类型转换。
说明:在书写代码时,必须确定表的结构和表中各个字段的数据类型,特别是书写
查询条件时的字段就更要注意了。
例如:以下代码不符合规范,status_type是 number型数据.
select
_entity_id
from
_discrete_jobswdj
where
=‘3’;
应如下书写:
select
_entity_id
from
_discrete_jobswdj
where
=3;
不要将空的变量值直接与比较运算符(符号)比较。如果变量可能为空,应使用 isnull
或 isnotnull或 nvl函数进行比较。
例如:以下代码不符合规范
ifv_user_name=nullthen
_line(‘usernameisnull’);
endif;
应该如下书写:
ifv_user_nameisnullthen
_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
_name
intov_user_name
fromfnd_userfu
_id=p_user_id;
end;
当一个 PL/SQL或 SQL语句中涉及到多个表时,始终使用别名来限定字段名,这使其
它人阅读起来更方便,避免了含议模糊的引用,其中能够别名中清晰地判断出表名。
别名命名时,尽量避逸使用无意义的代号 a、b、c…,而应该有意义(如表
system_items_b对应别名为 msi,po_headers_all别名对应为 pha)。
例如:以下编码不符合规范:
select
wip_entity_name,_entity_id,_released
from
_entitiesb,
_discrete_jobsa
where
_entity_id=_entity_idand
_type=3and
_released>trunc(sysdate)
应如下书写:
_entity_name,_entity_id,_released
_entitieswe,
_discrete_jobswdj
_entity_id=_entity_id
_type=3
_released>trunc(sysdate)
4.设计规范
一般表设计
表 空 间 设 计 , 原 则 上 表 空 间 名 与 schema名 一 致 , 其 索 引 所 在 空 间 为
schemaname+index。
如:schema为 INV,则默认的表空间应该为 INV,所对应的索引空间为 INVINDEX
tablespace——每个表在创建时候,必须指定所在的表空间,不要采用默认表空间,
以防止表建立在 system空间上,导致性能问题。对于事务比较繁忙的数据表,必须
存放在在该表专用空间中。
根据性能需要,可以适当可曾加冗余;
特殊表设计原则
分区表——对于数据量比较大的表,根据表数据的属性进行分区,以得到较好的性
能。如果表按某些字段进行增长,则采用按字段值范围攻进行分区;如果表按某个
字段的几个关键值进行分布,则采用列表分区;对于静态表,则采用 hash分区或列
表分区;在范围分区中,如果数据按某关键字段均衡分由,则采用子分区的复合分
区法。
在分区表中不建议使用全局索引,因为 trunc分区时会导致全局索引失效,造成难
以维护。
索引设计原则
每个索引在创建时,必须指定表空间,不要采用默认表空间,以防止索引建立在
system空间和非索引专用空间,以减少 IO冲突,提高性能。
完整性设计原则
主键约束——原则上所有的数据表都要有主键。对于数据量比较大的表,要求指定
索引字段。
外键关联——对于关联两个表字段,一般应该分别建立主键、外键。实际是否建立
外键,根据对数据完整性的要求决定。为了提高性能,对于数据量较大的表要求对
外键建立索引。对于有要求级联删除属性的外键,必须指定 ondeletecascade.
Null值——对于字段能否为 null,应该在 sql建表脚本中明确指定,不应该使用缺
省。由于 null值在参加任何计算时,结果均为 null,所以在程序中必须用 nvl()函
数把可能为 null值的字段或变量转换非 null的默认值。
Check条件——对于字段有检查性约束,需指定 check原则。
触发器
触发器是一种特殊的存储过程,通过数据表的 DML操作而触发执行,其作用为确保
数据的完整性和一致性不被破坏而创建,实现数据的完整性约束。
说明:触发器的 before或 after事务属性的选择时候,对表操作的事务属性必须
与应用程序保持一致,以避免死锁发生,在大型导入表中,尽量避免使用触发器。
在系统中不要使用过多的触发器。
视图设计
尽量使用简单的视图,避免使用复杂的视图。
简单视图:数据来自单个表,且无分组(distinct/groupby)、无函数。
复杂视图:数据来自多个表,或有分组、有函数。
性能优化
避名频繁 commit,尤其是把 commit写在循环体中每次循环都进行 commit。
使用绑定变量,避免常量的直接引用。
例如:以下书写不符合本规范.
insertintosm_users(user_id,user_name,created_by,creation_date)values
(1,’Tang’,-1,sysdate);
建议用如下方式操作:
declare
_id%type;
v_user_namesm_users_user_name%type;
_by%type;
_date%type;
begin
…………………
insertintosm_users(
user_id,
user_name,
created_by,
creation_date)
values(
v_user_id,
v_user_name,
v_created_by,
v_creation_date);
in、exists的使用规范
例如:当有 A、B两个结果集,当结果集 B很大时,A较小时,适用 exists,如:
select*
froma
whereexists(=);
当结果集 A很大时,B很小时,适用 in,如:
select*
froma
(
fromb)
避免不必要的排序
说明:对查询结果进行排序会大大的降低系统的性能。
对于数字型的唯一键值,用序列 sequence产生。
索引的规则:
建立索引常用的原则如下:
1).表的主键、外键必须有索引
2).1000行的表应该有索引
3).经常与其它表进行连接的表,在边接字段上应建立索引
4).经常出现在 where子句中的字段且过滤性极强的,特别是大表的字段,应该
建立索引
5).索引字段,尽量避免值为 null
6).复合索引的建立需要仔细分析;尽量考虑用单字段索引代替;
A.正确选择复合索引中的第一个字段,一般是选择性较好的且在 where子句
中常的字段上;
B.复合索引的几个字段是否经常同时以and方式出现在where子句中?单字
段查询是否极少其至没有?如果是,则可以建立复合索引;否则考虑单字段
索引;
C.如果复合索引中包含的字段经常单独出现在 where子句中,则分解为多个
单字段索引;
D.如果复合索引所包含的字段超过 3个,那么仔细考虑其必要性,考虑减少
复合的字段;
E.如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合
索引;
7).频繁 DDL的表,不要建立太多的索引;
8).删除无用的索引,避免对执行计划造成负面影响;
让 SQL语句用上合理的索引。
原则如下:
首先,看是否用上了索引,对于该使用索引而没有用上索引的 SQL语句,应该想办
法用上索引。
其次,看是否用上了索引,特别复杂的 SQL语句,当其中 where子句包含多个带有
索引的字段时,更应该注意索引的选择是否合理。错误的索引不仅不会带来性能的提高,
相反往往导致性能的降低。
针对如何用上合理的索引,以 Oracle数据中的例子进行说明:
任何对列的操作都可能导致全表扫描,这里所谓的操作包括数据库函数、计算
表达式等等,查询时要尽可能将操作移至等式的右边,甚至去掉函数。
避免不必要的类型转换,要了解“隐藏”的类型转换。
增加查询的范围,限制全范围的搜索。
索引选择性低,但数据分布差异很大时,仍然可以利用索引提高效率。
Oracle优化器无法用上合理索引的情况下,利用 hint强制指定索引。
使用复合索引且第一个索引字段没有出现在 where中时,建议使用 hint强制。
pl/sql使用短路径法,当计算逻辑表达式,即:一旦确定后,pl/sql停止计算表达
式。【推荐】
notin的替换写法【推荐】
例如:
selectdeptno
fromdept
wheredeptnonotin
(selectdeptnofromemp)
建议写成:
selectdeptno
fromdept,emp
=(+)and
like子句尽量前端匹配【推荐】
like参数使用得非常频繁,因此如果能够对于 like子句使用索引,将很好地提高查询
的效率。
例如:查询城市代码
select*
fromcity
wherecity_namelike‘%ZHEN%’
修改为
select*
fromcity
wherecity_namelike‘SHNEZHEN%’
避免使用 select*语句。
说明:不要用*来代替所有字段,应给出字段列表,注:不包含 selectcoun(*).例
如:以下不符合规范:
insert语句必须给出字段列表,使用 insert语句一定要给出要插入的字段列表,
这样即使更改了表结构加了字段也不会使用引用了本表的存储过程失效。
从表中同一笔记录中获取记录的字段值,须使用同一 SQL语句得到,不允许分多条
SQL语句。
例如:以下不符合此规范
selectduty_id
intov_duty_id
fromsm_duty
whererownum=1;
selectduty_name
intov_duty_name
fromsm_duty
whererownum=2;
应如下书写:
selectduty_id,duty_name
intov_duty_id,v_duty_name
fromsm_duty
whererownum=1
5.书写规范
缩进风格
程序块采用缩进风格书写,保证代码清晰易读,风格一致,缩进格数统一为 2个。
必须使用空格,不允许使用 TAB键。
具体语句参考“编码规范”小节
空格及换行
不允许把多个语句写在一行中,即一行只写一条语句。
例如:以下书写不符合规范:
v_count:=1;v_creation_date:=sysdate;
应写成:
v_count:=1;
v_creation_date:=sysdate;
相对独立的程序块之间必须加空行。两个程序块在逻辑上相对独立,应用空行加以
分隔,同时增加注释。
超过 80列的语句要分行书写,长表达式应在低先级操作符处换行,操任符或关键字
放在新行之首。划分出新行应当适当地缩进,使排版整齐,语句可读。
begin、end独立成行
例如:以下不符合规范
beginnull;exceptionwhenothersthennull;end;
应写成:
begin
null;
exception
whenothersthen
null;
end;
6.注释说明
一般性注释
注释尽可能简洁、详细而全面。
创建每一数据库对象时都要加上 COMMENTON注释,以说明该对象的功能和用途;
建表时,对某些数据列也要加上 COMMENTON注释,以说明该列和/或列取值的含
义。如:XX表中有 CZZT列属性为 NUMBER(10,0)可加 COMMENTON注释如下
'0=正常,1=等待,2=超时,3=登出'
在 pl/sql中,为每个变量声明添加注释,说明该变量用途。
在块的每个主要部分之前增加注释,说明该段语句及算法的目的以及要得到的
结果。
注释语法包含两种情况:单行注释、多行注释
单行注释:注释前有两个连字符(--),一般对变量、条件子句可以采用该
类注释。
多行注释:符号/*和*/之间的内容为注释内容。对某项完整的操作建议使
用该类注释。
函数文本注释
在每一个块和过程(存储过程、函数、包、触发器、视图等)的开头放置注释。
/**********************************************************************
**
函数名称:
功能描述:
输入参数:
输出参数:无
返回值:无
创建者:<中文姓名>
创建时间:2010-04-10
---------------------------------------------------修 改 记 录
----------------------------------------------
修改人员:
修改时间:
修改内容:
*************************************************************************/
CREATE[ORREPLACE]PROCEDUREdfsp_xxx
…
传入参数的含义应该有所说明。如果取值范围确定,也应该一并说明。取值有特定
含义的变量(如 boolean类型变量),应给出每个值的含义。
在每一个变量声明的旁边添加注释。说明该变量要用作什么,通常,简单使用单行
注释就行了,例如 l_sfhCHAR(11)--身份证号码。
在块的每个主要部分之前添加注释
在块的每个主要部分之前增加注释,解释下—组语句目的,最好是说明该段语句及
算法的目的以及要得到的结果,但不要对其细节进行过多的描述
在块和过程的开头注释中还可以增加要访问的数据库等信息
7.异常规范
异常规范
对于存储过程、函数等程序块都要有异常处理部分,以提高程序的自检能力。
异常节格式如下:
--自定义异常
my_errEXCEPTION;
…
--抛出自定义异常
RAISEmy_err;
…
--异常节
EXCEPTION
WHENmy_errTHEN
<statements>
WHENno_data_foundTHEN--系统预定义异常
<statements>
…
WHENothersTHEN
<statements>
END;
在异常节的最后都要设置 others异常处理,它处理所有没有明确列出的异常。
项目开发阶段,为了调试方便、快速定位错误,可以创建 xtycxx(系统异常信息)
表,记录产生系统异常的存储过程或函数名、异常名,如果过程或函数中有多个程序块,
记录块的描述信息。
例如
EXCEPTION
WHENno_data_foundTHEN
INSERTINTOxtycxx
(ccmc,ycmc,ms)
VALUES(‘ap_name’,’no_data_found’,’获取操作文档编号’);
…
WHENothersTHEN
INSERTINTOxtycxx
(ccmc,ycmc,ms)
VALUES(‘ap_name’,’others’,’获取操作文档编号’);
RETURN;
END;
后台验证异常信息规范
使用数据库过程、函数进行后台数据验证时,发现异常情况,需要记录异常,并返
回到用户界面。
异常信息描述要求简洁、准确、完整,揭示异常实质,准确定位异常出现的位置。
异常分为警告和错误两类。
由于每个实际项目,业务不同,异常信息也变化很大。每个项目开始时根据需求,
统一进行定义。
8.附录
附一开发工具
Oracle开发工具使用。【推荐】
项目开发统一使用集成的开发环境 pl/sqldeveloper作为开发工具,用于开发、测
试、调试和优化 pl/sql存储程序单元。
项目组成员使用 pl/sqldeveloper的美化器功能,选取统一的规则文件,自动美化。
多人编写的代码具有相同的书写格式,风格统一。查询语句还可最大化重用共享池中的
sql语句,提高应用程序性能。
以下工具可以做为参考工具:
1、编码工具:ultraedit-32全称:UltraEdit–32ProfessionalText/HextEditor
公司:IDMComputerSolutions,Inc.网址:http:///
2、测试工具:pl/sqldeveloper
全称:pl/sqldeveloper
公司:AllroundAutomations
网址:http:///
3、调试工具:toad
全称:QuestToadforOracle
公司:QuestSoftware
网址:http:///
4、调试工具:sqldeveloper
全称:sqldeveloper
公司:Oracle
网址:http:///technology/products/database/sql_developer/
附二预定义异常
Oracle预定义异常:【推荐】
预定义系统异常 产生原因
ACCESS_INTO_NULL 未定义对象
CASE_NOT_FOUND CASE中若未包含相应的 WHEN,并且没有设置 ELSE时
COLLECTION_IS_NULL 集合元素未初始化
CURSER_ALREADY_OPEN 游标已经打开
DUP_VAL_ON_INDEX 唯一索引对应的列上有重复的值
INVALID_CURSOR 在不合法的游标上进行操作
INVALID_NUMBER 内嵌的 SQL语句不能将字符转换为数字
NO_DATA_FOUND 使用 selectinto未返回行,或应用索引表未初始化的元素时
TOO_MANY_ROWS 执行 selectinto时,结果集超过一行
ZERO_DIVIDE 除数为 0
SUBSCRIPT_BEYOND_COUNT 元素下标超过嵌套表或 VARRAY的最大值
SUBSCRIPT_OUTSIDE_LIMIT 使用嵌套表或 VARRAY时,将下标指定为负数
VALUE_ERROR 赋值时,变量长度不足以容纳实际数据
LOGIN_DENIED
PL/SQL应用程序连接到 oracle数据库时,提供了不正确的用
户名或密码
NOT_LOGGED_ON PL/SQL应用程序在没有连接 oralce数据库的情况下访问数据
PROGRAM_ERROR PL/SQL内部问题,可能需要重装数据字典&pl./SQL系统包
ROWTYPE_MISMATCH 宿主游标变量与 PL/SQL游标变量的返回类型不兼容
SELF_IS_NULL 使用对象类型时,在 null对象上调用对象方法
STORAGE_ERROR 运行 PL/SQL时,超出内存空间
SYS_INVALID_ID 无效的 ROWID字符串
TIMEOUT_ON_RESOURCE Oracle在等待资源时超时
附三范式
第一范式
规则:表的每一格必须是单值的说明:第一范式要求一行代表一个记录。表都有主
键,而其值在整个表中是唯一的。
第二范式
规则:除满足第一范式外,每一个不属于主键的字段,必须依赖于主键的整体。
说明:主键码可以由一组字段构成,如果某一个不属于主键码的字段,只依赖于主
键码的一个字段,即有部份依赖关系,则不满足第二范式。为了满足第二范式,则必须
将部份依赖的字段抽出新建一个表,在大部份情部下,表的主键只有一个字段,因此第
二范式总是成立的。
第三范式
规则:一个关系如果在第二范式中,且没有传递依赖,所有不属于主键码的字段,
必须仅依赖于主键码,而不能依赖于其他字段。
说明:第三范式主要强调主键的统帅地位,所有的字段都必须且只能依赖它,不能
依赖其它字段,如果违返第三范式,表格内就可能有空的单元,浪费空间。要满足第三
范式,只有把表分为几个小表。但在查询时,就会关联多个表,降低了系统的响应时间。
故在设计数据库时,可能会故意违返第三范式,以获得更高执行效率。
-Codd范式
规则:一个关系如果的第三范式,且在每个属性或属性组(一个决定者)上任何属性
所依赖的都是某个侯选码(即,唯一的),则满足 Boyce-Codd范式。
说明:Boyce-Codd的规范化级别一般不应在关系数据库产品。
第四范式
规则:满足 Boyce-Codd范式,没有多值依赖,且不存丰下列条件时,则满足第四范
式:
1)依赖属性或属性集不是它所依赖的属性或属性集(决定者)的子集。
2)决定者加上依赖属性是整个实体的属性。说明:不应用在关系数据库产品中。
第五范式
规则:满足第四范式,且在实体的候选码中没有连接依赖时,则满足第五范式。
说明:第五范式所讨论的依赖非常模糊,不应用在关系数据库产品中。
反规范化
规则:满足第四范式,且在实体的候选码中没有连接依赖时,则满足第五范式。
说明:第五范式所讨论的依赖非常模糊,不应用在关系数据库产品中。
出于数据库性能原因,对规范化的数据库的再考虑,修改表结极以允许冗余数据的
存在。