SQL编码要求规范.docx
- 文档编号:7604901
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:16
- 大小:23.49KB
SQL编码要求规范.docx
《SQL编码要求规范.docx》由会员分享,可在线阅读,更多相关《SQL编码要求规范.docx(16页珍藏版)》请在冰豆网上搜索。
SQL编码要求规范
SQL编码规
(V0.1)
神州数码思特奇信息技术股份
2021/9/273:
40:
00
文档信息
文档名称
SQL编码规
电子文档
文件状态
■草稿□正式发布□正在修改
编写人
日期
2010-11-15
校对人
日期
年月日
审核人
日期
年月日
批准人
日期
年月日
变更记录
变更序号
变更原因
变更页码
变更前版本号
变更后版本号
更改人
批准人
生效日期
备注
1
文档修改
1概述
制定编码规的最主要的目的是为了对产出代码的长期维护。
通常负责维护代码的人大多都不是开发者本人,如果有一个统一的代码格式以及说明就可以减少混淆提高理解速度。
因此,下列的编码规是基于良好的编码习惯和可读性的原则来制定的。
1.1.围
本规定义了所有代码编写者在编写SQL程序时应遵守的一些规则和习惯。
本规采用以下术语描述:
规则:
编程时强制必须遵守的原则。
建议:
编程时必须加以考虑的原则。
说明【】:
对此规则或建议进行必要的解释。
示例:
对此规则或建议从正、反两个方面给出例子。
2命名规
2.1数据库对象
命名对象围:
ORACLE数据库对象,包括表、索引、存储过程、触发器、序列、视图、同义词、数据链路。
建议2.1命名长度和结构
对象名不超过30个字符,不低于6个字符,建议在8-25个左右。
由3-5部分构成,每部分为有一定含义的英文缩写或者数字。
每部分建议为3-4个字符。
英文缩写参见“常见缩写字典”。
规则2.2不得出现省市、项目简称
不允许出现某省某地市或某项目的简称,例如sc_CustInfo中的sc是不许可的。
规则2.3年月日等数字
年月日数字符号,一般应在数据表的尾部。
不允许将年月日及其它数字放在对象名的中间。
例如,Cust200703Info不许可,CustInfo200703则许可。
规则2.4区分非正式表
存在于生产环境的非正式表,如备份表,必须以原表名加前缀‘bakyymmdd_’,以便于识别和及时清理。
因此,正式生产表中,最好不要出现BAK、BACK之类的字符串。
规则2.5命名特例
编号
数据库对象
格式例
备注
1.
全局临时表(golbaltemporarytable)
gTmp_XxxYyyZzz
全局临时表属于ORACLE的一种特殊的表类型,不是指‘临时’创建的非正式表
2.
视图
View_XxxYyyZzz
3.
普通索引
Idx_TabName_ColumnName
ColumnName是该索引第一个字段的简写
4.
主键索引
Idx_TabName_Pk
5.
同义词
必须与原对象名一致
若已存在相同的对象名,必须合理调整该冲突对象名或者放弃使用同义词
6.
触发器
Trig_XxxYyyZzz
7.
存储过程
Proc_XxxYyyZzz
8.
程序包
Pkg_XxxYyyZzz
9.
函数
Func_XxxYyyZzz
10.
序列
Seq_XxxYyyZzz
11.
数据链路
Link_UserName_DbName
DBNAME是指远程数据库的名称,USERNAME是指该远程库的用户名
12.
分区表中的分区名
Part_Xxx
2.2常用英文缩写字典
规则2.8:
业务操作类
中文名称
英文名称
英文缩写
读取
get
get
设置
set
set
查询
query
qry
变更
change
chg
提交、确认
confirm
cfm
冲正、回滚
rollback
roll
验证
validate
vali
比较
pare
cmp
创建
create
crt
选择
select
sel
插入
insert
ins
修改
update
upd
删除
delete
del
转移
transfer
tran
替换
replace
rpl
计算
calculate
calc
统计
statistic
stat
申请
request
req
预约、预订
book
book
订购
order
ord
退订
cancel
canc
打开
on
on
关闭
off
off
配置
config
cfg
分配
allocate
allo
结算
mediation
med
费用
fee
fee
发布
release
rls
跟踪
trace
trac
清除
clear
clr
稽核
audit
aud
开户、入网
open
open
业务变更
change
chg
查询
query
qry
过户
Changecustomer
chgCust
缴费
payment
pay
托收
contract
con
规则2.9:
业务名词类
中文名称
英文名称
英文缩写
代码
code
code
类型
type
type
标识
identifier
id
No.
no
序号
seriation
ser
名称
name
name
消息
message
msg
信息
information
info
历史
history
his
日志
log
log
密码
password
psw
状态
status
sta
日期
date
date
时间
time
time
科目
item
item
关系
relation
rlt
组织、机构
organization
org
角色
role
role
地址
address
addr
担保
assurer
ass
版本
version
ver
级别
level
lev
phone
ph
合同
contract
con
发票
invoice
inv
接口
interface
intf
操作
opration
op
功能
function
func
客户
customer
cust
集团
group
grp
用户
subscriber
sub
account
acc
产品
product
prd
服务
service
svc
价格
price
pri
资源
resource
res
权限
power
pow
3注释规则
规则3.1对象注释要求
创建每一数据库对象时都要加上MENTON注释,以说明该对象的功能和用途;建表时,对某些数据列也要加上MENTON注释,以说明该列和/或列取值的含义。
示例:
mentontableRasInfo.TD_UserInfois
'普通地区用户信息表,用于记录除外的其他地区的用户信息,按地区分区';
mentoncolumnRasInfo.TD_UserInfo.UserCodeis'用户编码,主键';
规则3.7单行注释
SQL程序中,尽量采用单行注释:
’--’。
标准注释,但是只能注释一行
还有:
/*Formattedon2010/11/2210:
47(FormatterPlusv4.8.6)*/
规则3.2文件注释
在每个SQL脚本文件的开头,要用块注释,进行文件功能说明,文件编写人、联系方式和文件创建时间说明等。
由于PL/SQL语句的特殊性,每行注释前以’--’为标志。
示例:
-----------------------------
--收入保障系统后台数据库脚本
--
--
--文本责任人:
丁凌风(dinglfsi-tech..)
--
--2007.02.28开始创建
------------------------------
规则3.6功能性注释
对较为复杂的SQL语句应注释,并说明算法和功能。
应对不易理解的分支条件表达式加注释。
对重要的计算应说明其功能。
过长的函数实现,应将其语句按实现的功能分段加以概括性说明。
4SQL程序编码规则
4.1可读性要求
规则5.1不允许使用SELECT*
使用SELECT语句时,不允许使用SELECT*,要使用明确的列名。
目的是防止数据字段增加后的影响。
规则5.2INSERT必须指定插入的字段名
使用INSERT时,必须指定插入的字段名,主要是考虑以后表结构的变动。
规则5.3函数及表达式放在等号左边
应将SQL语句中的数据库函数、计算表达式等放置在等号右边。
不要在等号的左边。
规则5.4不等于统一使用"<>"
Oracle认为"!
="和"<>"是等价的,都代表不等于的意义。
为了统一,不等于一律使用"<>"表示。
规则5.5使用表的别名
多表关联查询,必须使用表的别名。
5SQL性能规则与建议
5.1性能相关的规则
规则5.1添加索引提高效率
对大表的操作,业务规后,必须建立相应的索引,以提高查询效率。
规则5.2WHERE子句中不应对索引列使用函数
不要在WHERE子句中,不应该对索引列施以函数,否则该索引将无法使用。
规则5.3为共享SQL语句,要使用绑定变量
执行相同操作的SQL语句必须使用相同名字的绑定变量
例如:
第一组的两个SQL语句,绑定变量是相同的,而第二组中的两个语句绑定变量不同,即使赋于不同的绑定变量相同的值也不能使这两个SQL语句相同,达不到共享SQL语句目的。
a)第一组
selectpin,namefrompeoplewherepin=:
blk1.pin;
selectpin,namefrompeoplewherepin=:
blk1.pin;
b)第二组
selectpin,namefrompeoplewherepin=:
blk1.ot_ind;
selectpin,namefrompeoplewherepin=:
blk1.ov_ind;
5.2性能相关的建议
建议5.1减少子查询的使用
子查询除了可读性差之外,还在一定程度上影响了SQL运行效率.应尽量减少子查询的使用,采用其他效率更高、可读性更好的方式替代。
建议5.2使用DECODE函数来减少处理时间
使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.
示例:
SELECTCOUNT(*),SUM(SAL)
FROM EMP
WHEREDEPT_NO=0020
ANDENAMELIKE ‘SMITH%';
SELECTCOUNT(*),SUM(SAL)
FROM EMP
WHEREDEPT_NO=0030
ANDENAMELIKE ‘SMITH%';
可以用DECODE函数高效地得到相同结果
SELECTCOUNT(DECODE(DEPT_NO,0020,'X',NULL))D0020_COUNT,
COUNT(DECODE(DEPT_NO,0030,'X',NULL))D0030_COUNT,
SUM(DECODE(DEPT_NO,0020,SAL,NULL))D0020_SAL,
SUM(DECODE(DEPT_NO,0030,SAL,NULL))D0030_SAL
FROMEMP
WHEREENAMELIKE‘SMITH%';
类似的,DECODE函数也可以运用于GROUPBY和ORDERBY子句中
建议5.3用UNION替换OR(适用于索引列)
通常情况下,用UNION替换WHERE子句中的OR将会起到较好的效果.对索引列使用OR将造成全表扫描.注意,以上规则只针对多个索引列有效.如果有column没有被索引,查询效率可能会因为你没有选择OR而降低.
在下面的例子中,LOC_ID和REGION上都建有索引.
●高效:
SELECTLOC_ID,LOC_DESC,REGION
FROMLOCATION
WHERELOC_ID=10
UNION
SELECTLOC_ID,LOC_DESC,REGION
FROMLOCATION
WHEREREGION=“MELBOURNE”
●低效:
SELECTLOC_ID,LOC_DESC,REGION
FROMLOCATION
WHERELOC_ID=10ORREGION=“MELBOURNE”
注意:
WHEREKEY1=10(返回最少记录)
ORKEY2=20(返回最多记录)
ORACLE部将以上转换为
WHEREKEY1=10AND
((NOTKEY1=10)ANDKEY2=20)
建议5.4用Where子句替换HAVING子句
避免使用HAVING子句,HAVING只会在检索出所有记录之后才对结果集进行过滤.这个处理需要排序,总计等操作.如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销.
示例:
●低效:
SELECTREGION,AVG(LOG_SIZE)
FROMLOCATION
GROUPBYREGION
HAVINGREGION!
=‘SYDNEY'
ANDREGION!
=‘PERTH'
●高效:
SELECTREGION,AVG(LOG_SIZE)
FROMLOCATION
WHEREREGION!
=‘SYDNEY'
ANDREGION!
=‘PERTH'
GROUPBYREGION
建议5.5用EXISTS替代IN
在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下,使用EXISTS(或NOTEXISTS)通常将提高查询的效率.
示例:
●低效:
SELECT*
FROMEMP(基础表)
WHEREEMPNO>0
ANDDEPTNOIN(SELECTDEPTNO
FROMDEPT
WHERELOC=‘MELB')
●高效:
SELECT*
FROMEMP(基础表)
WHEREEMPNO>0
ANDEXISTS(SELECT‘X'
FROMDEPT
WHEREDEPT.DEPTNO=EMP.DEPTNO
ANDLOC=‘MELB')
建议5.6用NOTEXISTS替代NOTIN
无论在哪种情况下,NOTIN都是最低效的(因为它对子查询中的表执行了一个全表遍历).可以把它改写成外连接(OuterJoins)或NOTEXISTS.
示例:
SELECT…
FROMEMP
WHEREDEPT_NONOTIN(SELECTDEPT_NO
FROMDEPT
WHEREDEPT_CAT='A');
●(方法一:
高效)
SELECT….
FROMEMPA,DEPTB
WHEREA.DEPT_NO=B.DEPT(+)
ANDB.DEPT_NOISNULL
ANDB.DEPT_CAT(+)=‘A'
●(方法二:
最高效)
SELECT….
FROMEMPE
WHERENOTEXISTS(SELECT‘X'
FROMDEPTD
WHERED.DEPT_NO=E.DEPT_NO
ANDDEPT_CAT=‘A');
建议5.7用表连接替换EXISTS
通常来说,采用表连接的方式比EXISTS更有效率。
SELECTENAME
FROMEMPE
WHEREEXISTS(SELECT‘X'
FROMDEPT
WHEREDEPT_NO=E.DEPT_NO
ANDDEPT_CAT=‘A');
●(更高效)
SELECTENAME
FROMDEPTD,EMPE
WHEREE.DEPT_NO=D.DEPT_NO
ANDDEPT_CAT=‘A';
建议5.8用EXISTS替换DISTINCT
当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT。
一般可以考虑用EXIST替换。
示例:
●低效:
SELECTDISTINCTDEPT_NO,DEPT_NAME
FROMDEPTD,EMPE
WHERED.DEPT_NO=E.DEPT_NO
●高效:
SELECTDEPT_NO,DEPT_NAME
FROMDEPTD
WHEREEXISTS(SELECT‘X'
FROMEMPE
WHEREE.DEPT_NO=D.DEPT_NO);
建议5.9避免在索引列上使用计算
WHERE子句中,如果索引列参与计算,优化器将不使用索引而使用全表扫描。
示例:
●低效:
SELECT…
FROMDEPT
WHERESAL*12>25000;
●高效:
SELECT…
FROMDEPT
WHERESAL>25000/12;
建议5.10避免在索引列上使用NOT
避免在索引列上使用NOT,NOT会产生在和在索引列上使用函数相同的影响.当ORACLE”遇到”NOT,会停止使用索引转而执行全表扫描。
示例:
●低效:
(不使用索引)
SELECT…
FROMDEPT
WHERENOTDEPT_CODE=0;
●高效:
(使用了索引)
SELECT…
FROMDEPT
WHEREDEPT_CODE<>0;
需要注意的是,在某些时候,ORACLE优化器会自动将NOT转化成相对应的关系操作符。
NOT>to<=
NOT>=to<
NOT
NOT<=to>
建议5.11用>=替代>
●高效:
SELECT*
FROMEMP
WHEREDEPTNO>=4
●低效:
SELECT*
FROMEMP
WHEREDEPTNO>3
两者的区别在于,前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录。
6程序质量保证
规则6.1运行日志
是指SQL运行点的输出日志。
要求程序一定要使用日志语句,在运行过程输出。
日志的输出,可以是数据表,或者通过Java函数,或者UT_FILE包,书写到操作系统文件。
运行日志必须设置调试开关,在生产环境有效屏蔽其在开发测试环境输出的日志。
规则6.2错误日志
系统容错处理的日志,一定要与运行日志分开。
使用数据表时,错误日志的数据表与运行日志表不同;
使用操作系统文件时,错误日志文件名与运行日志文件名不同。
规则6.3工作日志
系统关键性的SQL执行情况,应包括语句、记录数等的日志,便于程序上线后维护。
规则6.4异常检查
SQL程序,一定使用BEGIN/EXCEPTION/END代码块,进行错误捕获,并输出错误日志。
7安全保障
7.1PL/SQL安全
DML/DDL语句需说明功能和要求
Insert/delete/update语句以及脚本中的CREATE/DROP/ALTER命令,应添加注释说明其功能和要求。
规则7.2游标使用结束后必须关闭
7.2数据库操作
规则7.1DML/DDL操作应显式写明对象属主
数据库的表应用,独立的存储过程,独立的函数,或者处理包的开头,带上明确的数据对象属主,以避免误操作。
例如:
dbcustadm.dcustmsg,
CREATEORREPLACEPACKAGEdbRevass.pkgOweSum_BASE
AS
BEGIN
END;
8排版规则
规则8.1
SQL语句的关键字SELECT、FROM、WHERE、AND等,必须尾部对齐。
规则8.2
语句的结束符“;”,放在语句的结束位置,不单独起一行。
SQL语句中不能有注释,如“/**/”、“--”等,注释写在SQL语句的外面。
规则8.4空格
SQL算数运算符、逻辑运算符连接的两个元素之间必须用空格分隔。
逗号之后必须接一个空格。
关键字、保留字和左括号之间必须有一个空格。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SQL 编码 要求 规范