新手帮助 | 版主申请 | BST制度 | MST制度
返回列表 回复 发帖

SQL&PL/SQL编程规范//带实例

一、 Sql&L/SQL书写规范:   ' f5 ^  ?" E- t4 ?1 R
1、 语句中出现的所有表名、字段名全部小写,系统保留字、内置函数名、Sql保留字大写。   
: C9 n' W( W9 {/ `/ K2、 连接符or、in、and、以及=、<=、>=等前后加上一个空格。
5 _3 z* w2 B1 }# |: O, `; j( h3、 对较为复杂的sql语句加上注释,说明算法、功能。
* L  z- }' _5 {注释风格:注释单独成行、放在语句前面。   0 W1 ~0 M: U0 o% {  W
  (1)   应对不易理解的分支条件表达式加注释;   
" P; e; d$ F, U  (2)   对重要的计算应说明其功能;   ! ~/ m# \& y7 ?3 S$ V3 M* l( Y. F7 u
  (3)   过长的函数实现,应将其语句按实现的功能分段加以概括性说明;   
4 w& b$ K- O# s) A& Z5 z  (4)   每条SQL语句均应有注释说明(表名、字段名)。   
% e0 f$ s, ], m  @# `  (5) 常量及变量注释时,应注释被保存值的含义(必须),合法取值的范围(可选)   
2 ^5 i" ?  z) W2 g# M0 Z% b! L% F! D  (6) 可采用单行/多行注释。(-- 或 /* */ 方式)   
0 z, M/ S% l/ o- K' H/ y$ V% X1 w4、 SQL语句的缩进风格   2 j) _- w) E3 x( r
(1) 一行有多列,超过80个字符时,基于列对齐原则,采用下行缩进   # g# m# T7 b; s& q
  (2) where子句书写时,每个条件占一行,语句令起一行时,以保留字或者连接符开始,连接符右对齐。   - `% V' m: _) u/ z3 [* p: i# F' E
5、 多表连接时,使用表的别名来引用列。   
, {4 g+ g( X1 G' g5 W6、 供别的文件或函数调用的函数,绝不应使用全局变量交换数据;   ' m6 C4 x5 Q/ `: E  C" Y! z
7、 变量令名不能超出ORACLE的限制(30个字符),令名要规范,要用英文令名,从变量上能看到变量的作用,如 $ N4 J! M% D% J0 g& h! R  y3 D3 ^
g名称       全局变量 + @. A+ [3 I3 h9 f  ^
m名称       局部变量
% U* U6 m. _. o, o2 J/ e# X9 ^c名称       光标 3 ^: ]/ C! x  F) c  E
p名称       参数
4 c9 a! n0 ^2 h. G4 o8、 查找数据库表或视图时,只能取出确实需要的那些字段,不要使用*来代替所有列名。要清楚明白地使用列名,而不能使用列的序号。 # s" N  k* q- a  O! L2 I3 ]
9、 功能相似的过程和函数,尽量写到同一个包中,加强管理。
9 i% ^* n1 s0 P( k$ c: Y, h, V如例(1)
( N# q# l+ z" K. {% [二、 书写优化性能建议   2 n# \, |) C; ^7 j; U, m: N
1、避免嵌套连接。例如:A = B and B = C and C = D   
; ?' ]* }4 v$ b3 H1 R- U( C2、where条件中尽量减少使用常量比较,改用主机变量
! Y: ~' G! n5 o) ]  Z9 Y7 c! b3、系统可能选择基于规则的优化器,所以将结果集返回数据量小的表作为驱动表(from后边最后一个表)。   
6 c0 v% O! B1 C1 G4、大量的排序操作影响系统性能,所以尽量减少order by和group by排序操作。   ) g* L+ D$ M9 I$ S8 \; T
如必须使用排序操作,请遵循如下规则:   . T( A9 r. g* k% j/ G' F
(1) 排序尽量建立在有索引的列上。   * Z5 o' w' o8 v/ q
(2) 如结果集不需唯一,使用union all代替union。   
4 u/ H2 I& Z& K5、索引的使用。
) n3 g; p: N# V1 K/ z  D8 I" V! S(1) 尽量避免对索引列进行计算。如对索引列计算较多,请提请系统管理员建立函数索引。 ( U$ K) Z0 `  u# z5 Z& ~
(2) 尽量注意比较值与索引列数据类型的一致性。 3 {6 n1 a5 @* ~
(3) 对于复合索引,SQL语句必须使用主索引列   " z, Y$ f& P: Q
(4) 索引中,尽量避免使用NULL。 " k( ]( U) X( n, ]* c6 J2 w
(5) 对于索引的比较,尽量避免使用NOT=(!=)
( U. r( e" x3 V+ D3 M4 g- z9 s(6) 查询列和排序列与索引列次序保持一致   , f, W6 c# n$ i2 Z8 @
6、尽量避免相同语句由于书写格式的不同,而导致多次语法分析,尽量使用Bind变量。   
& n+ [; @0 ~3 b8 Y' y    7、尽量使用共享的SQL语句。 - P; d" q' a& n, E* [" u
8、查询的WHERE过滤原则,应使过滤记录数最多的条件放在最前面。   
8 X! o) d0 s! o1 d8 b5 m    9、任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。   
" g$ n, ]7 O  F: w: ^: `10、in、or子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引。
3 y8 `6 A  j$ m! A8 O) b* l三、其他经验性规则   # Y' Q3 `6 F5 [& y1 ~( p
  1、尽量少用嵌套查询。如必须,请用not exist代替not in子句。如例(2)   
9 a' F- a6 p4 s: J& m9 P2、用多表连接代替EXISTS子句。如例(3) 4 [; [- O% M5 \! G! C- u
3、少用DISTINCT,用EXISTS代替 如例(4)   6 o/ I8 ], n' X* K! P2 n  u- x
4、使用UNION ALL、MINUS、INTERSECT提高性能   " Y$ n- w( T; G! q
5、使用ROWID提高检索速度。对SELECT得到的单行记录,需进行DELETE、UPDATE操作时,使用ROWID将会使效率大大提高。   
$ n6 A: E& x1 v  M6 B6、使用优化线索机制进行访问路径控制。   
5 J& p6 `" N) {  F: H/ K7、使用cursor时,显示光标优于隐式光标
  W- B) i& }! c& ~! [: O" Y

SQL&PL/SQL编程规范//带实例

+ J8 Q% U% R+ B4 A/ W3 H4 Q" I
本规范示例:     D& _9 C1 n; ?6 W( I0 V( }
例一:   
: C) q7 q9 k4 Z% Y  SELECT aka042 -- 单位缴费划入个人帐户比例   6 a0 r, `% {, E0 p  c% I3 g
  INTO prm_aaa043   
; Z. f# Z! @$ _  k8 o" y  FROM ka01 --医疗保险单位缴费划入个人帐户比例分段信息   / r' b+ i% J3 K% M
  WHERE akc021 = rec_kc01.akc021 -- 医疗人员类别   8 h% L. d5 K5 ~8 ?" ?- ^7 X
  AND aka041 >= rec_kc01.akc023 -- 年龄上限   
) u+ n6 a4 E; _3 T! f( A  AND aka040 <= rec_kc01.akc023 -- 年龄下限   & x" A1 E7 x# C7 @
  AND aae030 <= prm_date -- 开始时间   
. t! g" Y, b; K, z  ]- A; a" b( P  AND ( aae031 >= prm_date OR aae031 IS NULL ); -- 终止时间   
( C$ U4 |0 l: h9 G; t6 i& @    1 K- P7 u( t- s0 I
例二:   
6 S5 K3 M0 ^  N  X SELECT ......   * \4 {. U: w7 e% T9 C
  FROM emp   
  }* a* k. H5 m; t  WHERE dept_no NOT IN ( SELECT dept_no   
- G+ P% i4 `% }. |  FROM dept   , Q/ W/ A; T! U! a1 |
  WHERE dept_cat=';A';);   
4 [! o0 ], Z6 u6 `4 M    ( G- @- p  R# ]+ ]+ J; g9 R
  O SELECT ......   
8 k: v  u, R- ^3 Q: s  FROM emp e   
; O" m2 g7 H1 B: R! R" x2 y5 }  WHERE NOT EXISTS ( SELECT ';X';   
& t: v$ n) U! ?/ ~5 T4 M  n  FROM dept   $ ?1 z4 k( @$ u, H- R6 N$ M' F
  WHERE dept_no=e.dept_no   7 j& g& H) S- u4 D2 b' e
  AND dept_cat=';A';);   . j/ L  b% C- u! N' E& `
例三:   / ~  y% q$ E6 N& r& W
  X SELECT ......   
) ~- ~, ]- X& L! I5 Q' d" V      FROM emp   
* _7 ~. v  l# }* {  WHERE EXISTS ( SELECT ';X';   * \  I' S' I2 u# a* ]* H
  FROM dept   
! a: H/ C+ p; N* A  Z  WHERE dept_no=e.dept_no   - d$ N$ B- G/ a2 V2 e, O! Q9 e
  AND dept_cat=';A';);   
* f: i% g3 A/ `8 U   
( V& U: i) G2 F" L4 i+ a) _  O SELECT ......   - U6 y( |7 j9 v  c' d& e4 I
  FROM emp e,dept d   $ B' R% v" U. z7 A7 T& m. J. J0 H
  WHERE e.dept_no=d.dept_no   ( v# p" @/ L4 U9 x
  AND dept_cat=';A';;   
+ ?+ K& o6 {2 E- L) h/ L  , J, O5 b& a+ _; l( U& @3 g1 t! L
例四:   
* ?- p1 z. `, o3 n& W+ U  X SELECT DISTINCT d.dept_code,d.dept_name   
; k! j' `& k. D8 d, f  FROM dept d ,emp e   
  H$ l! @8 g7 K/ e7 t7 Q- C  WHERE e.dept_code=d.dept_code;   3 O# y, j2 E7 @+ y' D5 F; ]
    3 b. |4 U) F/ _* r( {
  O SELECT dept_code,dept_name   2 h2 k  a  H% s7 t
  FROM dept d   
* g/ X& R. s$ c6 q, p  WHERE EXISTS ( SELECT ';X';   
" b# i4 w% _: c1 o  FROM emp e   
/ ?2 L; a" W" V; q' ?+ ?9 b0 Y  WHERE e.dept_code=d.dept_code);   
( g, g" }# a$ \5 R$ \9 z' A( k- [' |6 G
注释范例 - J. b, n( q& l- I$ k. C
过程注释: / Z" L5 s2 G7 B& G/ r; N
过程都以sp_开头,注意过程名称要符合令名要求
1 t" i5 B  S( F2 s/************************************************************************** , |- K- ]9 D, |6 d! [
name:sp_Write_log # L9 \6 z1 H# U, {! u3 G- l2 p
parameter:p_textContext in varchar2 参数描述
& {( f% f8 ]1 ~+ zcreate date:2003-04-1
! [/ \1 z9 M/ F, Y9 a' Ycreater:chen jiping
- X/ }8 z+ K- U5 |% }0 hdesc:过程总功能描述 4 s" T; ~( t1 ]& g) ~0 i' ^8 H
****************************************************************************/
/ u7 d3 [; `' W% E& L: @4 p$ s函数注释
- w: X. W' t% O% C4 L% |" y函数以f开头,令名符合令名标准 1 _- X- X( G- L' t  z% n0 {
/************************************************************************** 5 @3 K  c, V; {5 u, W4 ?& N8 D
name:f_Get_JobId
7 [/ Y5 m' s, z1 `parameter:p_Name in varchar2 参数描述
. ^: K, q( q; qreturn number:返回值描述
5 U6 \4 I; u' D/ K/ ycreate date:2003-04-1 6 F, i9 P& }6 ~
creater:chen jiping & k/ D/ i" G) ~+ E/ X+ R
desc:函数总功能描述
返回列表