您的位置:首页 > 数据库 > Oracle

【JAVA】存储过程学习之路1(Oracle)

2016-03-18 10:48 204 查看
因最近项目的需要,本想通过直接用Jdbc来进行大批量数据的查询以及插入,后来通过实际操作发现,还是太慢,所需时间太长,即使用executeBatch()也太慢了。于是昨天花一下午的时间,通过看教学视频和文档,了解了存储过程的应用。通过今天一上午的改编,成功将Jdbc的存取批量数据操作改成存储过程的调用操作,经检验,存储过程着实要比直接用Jdbc调用快的多。

而初次使用存储过程,遇到了一些小问题,并有一些小心得,在此记录一下:

1. 存储过程的传递参数的类型最好直接用%type来设置,以避免一些潜在的类型问题。

2. 存储过程的传递参数(in out)的定义有几点要注意,首先若想读取传递参数的值,必须定义in;而若想对传递参数进行赋值操作,必须定义out;若即想读取值又想赋值,则须同时定义in out。

3. cursor游标在使用for循环时,循环体内无法获取传入参数,只能获取cursor的参数和for循环的参数。(本人在进行如下操作时,未获取到,不知是否是学艺未精,未找到正确用法,本人后来改为while循环即可)

create or replace procedure insert_date(v_id emp.id%type, v_sex emp.sex%type) is
cursor c_cursor is select date from emp where sex = v_sex and emp.age > 18;
begin open c_cursor;
for v_birth in cursor loop
//这里报错,说v_id这个位置表达式参数类型错误
insert into emp_new(id,date) values (v_id,v_birth);
end loop;
end;


后来我改成

create or replace procedure insert_date(v_id emp.id%type, v_sex emp.sex%type) is
v_birth emp.date%type;
cursor c_cursor is select date from emp where sex = v_sex and emp.age > 18;
begin open c_cursor;
fetch c_cursor into v_birth;
while c_cursor%found loop
insert into emp_new(id,date) values (v_id,v_birth);
//这里一定要再让cursor游标取值,否则会陷入死循环,容易漏掉这一句
fetch c_cursor into v_birth;
end loop;
end;


若是要在java里循环调用存储过程,记住connection不要轻易关,会影响后面的调用。

如果调用存储过程有返回值,要记得关闭结果集。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java oracle 存储过程