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