因最近项目的需要,本想通过直接用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不要轻易关,会影响后面的调用。
- 如果调用存储过程有返回值,要记得关闭结果集。