如何编写高效健壮的ORACLE存储过程

来源 :中国新通信 | 被引量 : 0次 | 上传用户:guo20
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  【摘要】在数据库维护过程中,存储过程的编写的执行是必不可少的技能,本文作者结合自已的工作,讲述了如何编写高效健壮的ORACLE存储过程。而这些技术经常是一般的数据库维护人员所忽略的,因此对于提高维护技能,增加维护经验有很大的益处。
  【关键词】oracle显式游标隐式游标绑定变量
  做为一个应用系统维护人员,和数据库打交道是必不可少的。当发现表中的数据有误时,我们可以通过SQL语句去查询修改,但是当我们要修改一批数据,或者要对在前台增加某项处理功能的时候,我们就要编写存储过程,通过直接后台执行或前台功能调用的方法处理批量数据。企业级的数据库都是比较繁忙的,所以如何编写高效健壮的ORACLE存储过程就摆在了维护人员的面前。
  一、定义严格的数据类型
  Oracle的表中对数据类型有严格的定义,对于表中的列一般要定义:列的数据类型、列的最大长度和适当的精度、对于可接受值的约束。在存储过程中对于变量的定义没有以上的严格要求,但是过程中的变量一般都对应表中的列值,所以如果能够将两者关联定义对于过程健壮性是很好的保障。
  存储过程中大多数的变量直接与数据表的列挂钩,% TYPE可以将这种关系在代码中清晰的体现出来。如下面二个变量的定义都存储tf_f_user_customer.cust_name:
  V_custname varchar2(200);
  V_custname tf_f_user_customer.cust_name%type;
  对于第一种定义,如果表中的cust_name长度大于200个字符,那么执行时就会报错,需要重新修改V_custname的定义,但是对于第二种定义,由于变量和字段类型相关联,所以能够存储到字段的值必然也能够存储到变量里,且修改了字段的类型,变量的类型也会随之更改,不用人工再做调整,减轻了维护的工作量。
  和%TYPE类似的还有一个%ROWTYPE属性,它是将一个记录型的变量和一个表的所有列关联。如定义: v_trade tf_b_trade%rowtype;这样我们可以不必一个一个的定义每一个字段,可以将一个表中的一行记录取出后放到v_trade变量中统一处理,这种方法对于存储过程的编写和后期的维护都是非常方便的。
  保证所有适当的变量都是强类型的可以获得性能上的好处,虽然ORACLE在数据处理方面对于开发者的考虑是很周到的,如果将字符串赋给数值型变量,ORACLE会尝试将其转换成数据并完成赋值操作,但是为对系统资源的消耗是很大的。实验结果表明96%的执行时间消耗在了类型转换上。
  二、显式游标和隐式游标
  我们在编写存储过程的时候往往会用到显式游标,显式游标我们可以完全控制,且在一些教科书上都有一个结论:显式游标的性能是最好的。但是实验的结果表明,隐式游标在代码上更简洁,且在大多数的情况下性能等同于等价的显式游标,甚至更强。
  我们在存储过程中使用SELECT INTO语句(即隐式游标)对单行数据进行读取,有3种可能的结果:(1)结果集中只含有一行,且SELECT成功。(2)结果集中不包含任何行,引发NO_DATA_FOUND异常。(3)结果集中含有两行或更多行,引发TOO_MANY_ROW异常。
  有些人可能认为了发现第三个错误,该语句至少要执行两次,然而可以编写显示游标,控制代码只读取一次,所以显式游标的性能更好。但是在ORACLE7.1以后的版本引入了预读的概念,一次读取两行的数据,所以NO_DATA_FOUND异常和TOO_MANY_ROW异常都是由单次读取决定,且隐式游标编写更简洁,可读性更好。实验表明,单行读取的隐式游标要比显式游标效率提高20%。
  在FOR循环中使用隐式游标的语法来读取行集也是很有帮助的。可以在FOR循环中直接使用SQL语句,这要做可以不需要扫描代码的声明部分来检查定义。
  三、绑定变量
  在oracle中,对于一个提交的sql语句,存在两种可选的解析过程,一种叫做硬解析,一种叫做软解析。不使用绑定变量,对于执行频度非常高的sql,每次都会进行硬解析,这将带来很大的危害,而使得oracle能够重复利用执行计划的方法就是采用绑定变量。绑定变量的实质就是用变量替代sql语句中的常量。通过绑定变量使得每次提交的sql语句都完全一样。
  结语:以上我们讲述了如果提高存储过程性能和便于后期维护的方法,当然还有好多的方法在这里并没有提到,我们只有综合运用这些方法才能编写出高效健壮的存储过程。
其他文献
贝尔S1240交换机是我国早期各地普遍使用的一种机型,分布广且装机总容量最大,其退网换型是全国各地都要实施的工作,本文探讨退网过程中需要注意的问题和解决方法,优化操作流
以迪那2井为研究对象,运用CFD方法模拟预测井喷失控着火事故后果,并根据人和设备所能承受的热辐射通量得出不同伤害等级的伤害半径。通过模拟不同风力等级下的井喷失控着火得出
利用二维光子晶体的各向异性,结合原子的偶极辐射能量分布特点,提出通过改变原子的极化方向,可以使其自发辐射寿命显著地缩短或者延长,实现开关控制.发现在某些空间位置上,极化原子
各类历史教材中,都充斥着很多插图,特别是人教版的这套初中历史教科书,种类包括地图、历史照片、美术图、图表、示意图等,学生往往会忽略这些插图,在学习过程中认为不是正文
在交通运输部的统一部署下,山西省高速公路不停车收费系统将与北京、天津、河北、山东联网,实现京津冀鲁晋区域高速公路电子不停年收费系统联网。届时,该区域内ETC客户可在北京