【精编推荐】Oracle存储过程开发规范与技巧
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【精编推荐】Oracle存储过程开发规范与技巧
存储过程开发规范与技巧
开发规范
1.书写规范
1):程序头书写规范
程序头开始部分应说明程序整体的功能,存储过程名称,编写人,编写日期,修改人,修改日期,版本号以及过程涉及的表和视图。示例如下:
-----------------------------------------------------------------------------
/*
名称及实现功能:
版本: ( 版本号标示:新建 V1.0.0 小的修改变为V1.0.1 大的修改V1.1.0 重构V2.0.0)
Create by***Create Date2006-06-29
Update by*** update Date2006-06-30
修改原因:
Update by*** update Date2006-06-31
修改原因:
涉及的表或视图:
dump_init 辅助表(DM):记录存储过程中使用的物化视图日志序号
mlog$_acrcusmrsecindex 源表(ODS):客户第一索引物化视图日志,使用同义词
ft_gld_customerdata 目标表(DM):客户事实表
*/
CREATE OR REPLACE PROCEDURE *******
------------------------------------------------------------------------------ 2):代码书写规范
1.语句中出现的所有表名、字段名全部小写,系统保留字、内置函数名、Sql保留
字大写。
2.连接符or、in、and、以及=、<=、>=等前后加上一个空格。
3.where子句书写时,每个条件占一行,语句令起一行时,以保留字或者连接符开
始,连接符右对齐。
4.查询的WHERE过滤,原则应使过滤记录数最多的条件放在最前面。
5.多表连接时,使用表的别名来引用列。
6.查找数据库表或视图时,只能取出确实需要的那些字段,不要使用*来代替所有
列名。
7.功能相似的过程和函数,尽量写到同一个包中,加强管理。
示例如下:
BEGIN
--查询员工及对应的部门名称
SELECT ,
FROM l_dept dept,l_employee emp
WHERE emp.dept_id = dept.dept_id;
END;
3)注释书写规范
为了提高可读性,应该使用一定数量的注释。注释大约占总行数的1/5。
1:注释风格:注释单独成行、放在语句前面。
2:应对不易理解的分支条件表达式加注释;
3:对重要的计算应说明其功能;
4:过长的函数实现,应将其语句按实现的功能分段加以概括性说明;
5:每条SQL语句均应有注释说明
6:对于程序的整体功能,应在程序开始部分说明,可采用单行/多行注释。(-- 或/* */ 方式)
2.命名规范
存储过程技术
1.存储过程样例
CREATE OR REPLACE PROCEDURE example(
v_input IN NUMBER, --输入参数
v_output OUT NUMBER --输出参数
)
IS
PRAGMA AUTONOMOUS_TRANSACTION;
CURSOR c1 --定义一个游标,在begin之前
IS
SELECT b.tablename mlogtable,
MAX (remarks)KEEP(DENSE_RANK LAST ORDER BY starttime)
remarks FROM proc_log a,table_proc b
WHERE TO_CHAR (starttime,'yyyy-mm-dd')<= --转换时间并做比较
TO_CHAR ( SYSDATE - TO_DSINTERVAL (
TO_CHAR (intervaldays) || ' 00:00:00'),'yyyy-mm-dd') AND a.remarks LIKE'SUCCEEDED:%'
AND a.procedurename = b.procedurename
GROUP BY b.tablename); --定义结束
c1_rec c1%ROWTYPE; --定义接受游标数据行的ROWTYPE
v_mlogtable VARCHAR(30);
v_postperiod CHAR(2);
v_acctbalbeginseq NUMBER;
v_systime DATE;
BEGIN
v_input :=0; --变量赋值
v_systime := SYSDATE;
OPEN c1;--打开游标
LOOP --循环
FETCH c1 INTO c1_rec; --从当前游标行赋值c1_rec
EXIT WHEN c1%NOTFOUND; --游标没有数据退出
v_mlogtable := c1_rec.mlogtable; --从行取出具体数据赋给变量
CASE TRIM (LOWER (v_mlogtable)) --CASE起始
WHEN'String1' --当条件一
THEN --做条件一工作
BEGIN
v_remarks :=REPLACE(v_remarks,'AA');
END;
WHEN'String2' --当条件二
THEN
BEGIN
END;
ELSE --其他条件
NULL;
END CASE; --CASE结束
IF(LOWER (SUBSTR (v_mlogtable,1,5))<>'mlog$')
THEN
SELECT log_table
INTO v_mlogtable
FROM user_snapshot_logs
WHERE LOWER (MASTER)= LOWER (v_mlogtable);
END IF;
EXECUTE IMMEDIATE'delete from '
|| v_mlogtable