【精编推荐】Oracle存储过程开发规范与技巧

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档