77范文网 - 专业文章范例文档资料分享平台

ORACLE编程规范(6)

来源:网络收集 时间:2019-04-10 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

第6章 常用语法

6.1 变量声明

规则:代码中声明与表的字段相对应的变量时,应保证变量名和字段名相同。 说明:这样要求的目的是增强可读性。 示例:

DECLARE

v_DateField T_TABLENAME.DATEFIELD%TYPE; BEGIN

SELECT DATEFIELD INTO v_DateField FROM T_TABLENAME WHERE ROWNUM = 1; END;

规则:代码中声明与表的字段相对应的变量时,对类型的定义需要使用%TYPE方式。 说明:这样表结构的变动不会影响存储过程,避免表结构变更后出现变量长度或类型不一致的问题。

6.2 返回值

规则:函数的返回值定义应遵从下列规范:成功出口返回0,失败出口返回大于0整数。过程中定义的用于返回错误码的OUTPUT参数,其定义应遵从下列规范:成功出口返回0,失败出口返回非0整数。

6.3 符号*

规则:脚本中不允许出现“*”的用法,必须用实际的字段名代替,INSERT语句必须指定要插入的字段名。 示例:

1、游标定义

2013-03-28

第26页,共71页

错误用法:

CURSOR c_CursorName IS SELECT * FROM TABLENAME ...

正确用法:

CURSOR c_CursorName IS

SELECT FIELD1, FIELD2, ... FROM TABLENAME ...

2、INSERT 语句 错误用法:

INSERT INTO TABLENAME VALUES ...

正确用法:

INSERT INTO TABLENAME (FIELD1, FIELD2, ...) VALUES ...

6.4 包的使用

建议:ORACLE的包类似C++中的Class,有包头和包体两部分组成;包能够把相关的功能封装性在一个包中,包里面里可以有函数和过程。PACKAGE与PROCEDURE和FUNCTION的优点是封装性比较好;在开发过程中,可以把功能点紧密相关的PROCEDURE、FUNCTION封装在一个包里面。在对包体进行编译时,调用该包的存储过程不会失效。

6.5 绑定变量

规则:使用绑定变量的SQL语句,能使用绑定变量方式的业务逻辑下不允许使用绑定常量实现。

说明:在存储过程拼SQL语句作为动态SQL执行时,尤其需要注意。 示例:

错误用法:

v_SQL := 'DELETE FROM TABLENAME WHERE FIELD1 > SYSDATE AND FIELD2 = 102'; EXECUTE IMMEDIATE v_SQL;

正确用法:

v_ID := 102; 2013-03-28

第27页,共71页

v_SQL := 'DELETE FROM TABLENAME WHERE FIELD1 > :1 AND FIELD2 = :2'; EXECUTE IMMEDIATE v_SQL USING SYSDATE, v_ID;

规则:为提升性能,减少循环的开销,可以使用批量绑定。

说明:下面示例中的UPDATE语句可以一次将多条记录进行更新,而避免了通过使用循环同一条SQL执行多次。 示例:

CREATE OR REPLACE PROCEDURE P_CSP_TEST /*

Description : 根据输入的多个工单流水号,更新对应的SERVICECLASSID值 Author Date Version Caller Callee Comments History 1. Date */ (

i_SerialNos VARCHAR2, -- 一次输入多个工单流水号以'~'分隔' i_ServiceClassID VARCHAR2,

o_Ret OUT VARCHAR2 -- 成功返回0,失败返回1 ) AS

TYPE typ_StrArray IS TABLE OF VARCHAR2(500) INDEX BY BINARY_INTEGER; v_ArrSerial typ_StrArray; BEGIN

FOR i IN 1..9999 LOOP

-- 把输入参数的值取出存放在数组v_ArrSerial中

EXIT WHEN GetParamStr(i_SerialNos, '~', i, v_ArrSerial(i)) <> 0;

END LOOP;

-- 根据数组中的工单流水号批量更新 FORALL i IN 1..v_ArrSerial.COUNT 2013-03-28

第28页,共71页

Author

: 姓名 工号 : YYYY-MM-DD : 版本 : 调用者 : 被调用者 : 注释信息 :

: 修改日期,格式为YYYY-MM-DD : 修改人姓名与工号

Modification : 修改说明

2. ......

UPDATE T_WF_SERVICEINFO t

SET t.SERVICECLASSID = i_ServiceClassID WHERE SerialNo = v_ArrSerial(i);

COMMIT;

o_Ret := 0;

EXCEPTION

WHEN OTHERS THEN ROLLBACK; o_Ret := 1; END;

6.6 异常处理

规则:函数/过程中应该有异常处理的代码,除非需要将任何可能的异常都向上抛出。 说明:不论代码逻辑是否简单,只要有可能会抛出异常,函数/过程块就应该包括异常处理代码。详见代码模板。

规则:如果需要的话,可以在异常处理部分将异常继续向上抛出给调用者。

说明:如果有些异常是预料可能产生,而且脚本需要根据是否有异常来做不同的逻辑处理,这种情况可以在异常处理部分将该异常进行处理,但可能有些意料之外的异常,需要继续向上抛出,便于调用者了解脚本执行是否成功,以便于调用者作下一步的处理如写错误日志等操作。

规则:如果需要自定义异常,必须在异常处理块中对其进行处理。

说明:如果自定义了异常,却没有相应的代码进行处理,那么就应该去掉该异常的定义。

规则:在对容错性要求比较高的情况下,对异常块中的代码还需要判断是否可能触发异常,必要的时候应使用嵌套的异常。

说明:在异常处理部分中的写日志之前,如果有事务,一定要先ROLLBACK;异常块中写日志、向表中插入一条初始化记录等语句也可能失败,对这些代码必要时也应该增加异

2013-03-28

第29页,共71页

常保护,即使用嵌套的异常处理。

6.7 事务控制

规则:在任何出口之前,只要存在事务未结束,必须提交或者回滚,除非有特殊设计考虑。

说明:存储过程在每个出口前,如果启动了事务必须结束所有事务,以提交(COMMIT)或回滚(ROLLBACK)来结束事务,否则可能会导致表锁等严重问题;如果在存储过程中,没有启动事务,就不必执行COMMIT或ROLLBACK,否则多余的ROLLBACK或COMMIT操作将增加数据库的额外开销。

规则:ORACLE的事务是串行的,嵌套调用中内层存储过程的提交会导致外层的存储过程事务被一并提交;诸如生成流水号这类存储过程应使用独立事务,否则在产生流水号时就将之前的业务逻辑操作提交,而后续的操作不能保证在一个事务中。例如现有系统中一个工单循环派给多个部门时,循环体内产生流水号,如最后一个派单失败时回滚操作根本就不能回撤所有操作,导致事务一致性被破坏。

建议:尽量分解大事务,事务的大小应视系统的性能和应用的具体情况而定,过多过小的事务造成重做日志同步的等待,比如要往一个表插入100万条记录,如果每条记录提交一次,则事务太小,可以做一个计数器,设置1万或事务5万条作一次提交。

6.8 游标使用

规则:原则上避免使用游标,尤其是动态游标。 说明:

1. 游标的效率较低,如果在代码中可以通过不同的条件分支实现的逻辑,尽量不要使用

游标。

2. 动态游标通常都可以转化为若干个静态游标,因此除非必要,尽量使用静态游标代替

动态游标。

2013-03-28

第30页,共71页

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库ORACLE编程规范(6)在线全文阅读。

ORACLE编程规范(6).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/584069.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: