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:=''

博客参考

【1】http://www.cnblogs.com/aipan/p/5306613.html

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值