论文部分内容阅读
【摘要】在数据库维护过程中,存储过程的编写的执行是必不可少的技能,本文作者结合自已的工作,讲述了如何编写高效健壮的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语句都完全一样。
结语:以上我们讲述了如果提高存储过程性能和便于后期维护的方法,当然还有好多的方法在这里并没有提到,我们只有综合运用这些方法才能编写出高效健壮的存储过程。
【关键词】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语句都完全一样。
结语:以上我们讲述了如果提高存储过程性能和便于后期维护的方法,当然还有好多的方法在这里并没有提到,我们只有综合运用这些方法才能编写出高效健壮的存储过程。