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

9 篇文章 0 订阅
4 篇文章 0 订阅

因最近项目的需要,本想通过直接用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;
  1. 若是要在java里循环调用存储过程,记住connection不要轻易关,会影响后面的调用。
  2. 如果调用存储过程有返回值,要记得关闭结果集。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值