Oracle存储过程常见问题及解决方法

Oracle存储过程

     存储过程是为完成特定功能的SQL集。目前工作中用到的存储过程就是对数据库中的字段进行批量的更新。
  最近在写存储过程中遇到了一些问题,查阅了网上的解决方案,自己也记录下来,方便备查。
1、 内存溢出
  执行输出语句的时候报错:ORA-20000: ORU-10027: buffer overflow, limit of 20000 bytes,意思是说输出的buffer不够使用。
解决方案:
第一种方案,更改serveroutput的size值,更改语句为 SQL> set serveroutput on size 100000
第二种方案,直接在begin后面添加buffer不受限制的语句。

// 表示buffer不受限制
DBMS_OUTPUT.ENABLE(buffer_size => null); 

2、 数据为空
  遍历数据表中字段,会有为空的情况,执行报错:ORA-01403: no data found,意思是说没有找到数据,需要进行异常的处理。
解决方案:没有数据的时候需要抛出异常,添加以下语句。

// 没有数据时,将字符串指定值,这里直接给空
EXCEPTION WHEN NO_DATA_FOUND THEN
str := ''; 

3、 输出执行的结果
  想要查看程序执行的结果,打印出执行的结果,添加以下语句。

// 输出程序执行的结果语句
dbms_output.put_line(str);

存储过程Demo

下面列举了简单的存储过程的语法,供参考。
1、创建简单的存储过程

// 简单存储过程创建语句
create procedure GetPerson()
begin 
    select * from person; 
end;

2、调用和删除存储过程

// 调用存储过程
call GetPerson();
//删除存储过程
drop procedure if exists GetPerson;

代码参考:存储过程代码

// 完整的存储过程的代码
declare
 str varchar2(400);  --变量的声明
 A00 varchar2(100);
 begin
      for row_ABC in (select A00 from 表名 t ) loop  --遍历表中数据
          str:='';      
          A00:=row_ABC.A00;
	BEGIN
		DBMS_OUTPUT.ENABLE(buffer_size => null);  --buffer不受限制
		select  KK into str_6 from
		(select  xzzw KK from( select 字段)  as xzzw from 表名 where ZA01=A00));            
		dbms_output.put_line(str);   ---打印输出执行的结果
		update 表名 set 字段=str where a00=A00BL;  --更新表中对应信息
		EXCEPTION WHEN NO_DATA_FOUND THEN   --抛出异常
		str := '';    --并将字符串str置为空
		commit;   --数据提交
		END;
  END LOOP;  --循环结束
END;--游标结束

知识点

1、for loop 语句
  for loop 语句一种重复控制结构,可以有效地编写一个需要执行特定次数的循环。语法格式如下:

// for loop语法
for name in 表 loop
 End loop;

2、符号:=
 :=符号,在存储过程中相当于赋值的作用。例如初始化字符串str:=’’。

// :=符号的使用
str:=''

博客参考:http://www.cnblogs.com/aipan/p/5306613.html

你可能感兴趣的:(数据处理,数据库,存储过程,oracle)