Java执行Oracle存储过程

10 篇文章 0 订阅
7 篇文章 0 订阅

1 创建表和存储过程,并在DB测试存储过程:

==============================
CREATE TABLE ZTEST 
  (
    NAME VARCHAR2(10),
    ID   NUMBER
  )
==============================

==============================
create or replace
PROCEDURE usp_ztest (tid IN NUMERIC,out_cursor OUT SYS_REFCURSOR)
AS
   temp   VARCHAR2 (100);
BEGIN
    DBMS_OUTPUT.put_line ('id is ==='||tid); 
    OPEN out_cursor FOR  
    select * from ztest where id = tid;
    RETURN;
END usp_ztest;
==============================

set serveroutput  on;
declare 
out_cursor SYS_REFCURSOR;
v_row ZTEST%ROWTYPE;
begin
    usp_ztest(3,out_cursor);
    loop 
      fetch out_cursor into v_row;
      exit when out_cursor%notfound;
        dbms_output.put_line('--'||v_row.id||'--'||v_row.name);
    end loop;
    close out_cursor;
    commit;

exception 
  when too_many_rows then
  DBMS_OUTPUT.PUT_LINE('返回值多于1行');
  when others then
  DBMS_OUTPUT.PUT_LINE('在RUNBYPARMETERS过程中出错!');
end;

==============================
或者:
==============================
set serveroutput on;
declare 
out_cursor SYS_REFCURSOR;
v_id NUMBER;
v_name varchar2(20);
begin
    usp_ztest(5,out_cursor);
    fetch out_cursor into  v_name,v_id;
    while out_cursor%found 
    loop
      dbms_output.put_line('--'||v_id||'--'||v_name);
      fetch out_cursor into v_name,v_id;
    end loop;
    close out_cursor;
    commit;
exception 
  when too_many_rows then
  DBMS_OUTPUT.PUT_LINE('返回值多于1行');
  when others then
  DBMS_OUTPUT.PUT_LINE('在RUNBYPARMETERS过程中出错!');
  dbms_output.put_line(SQLCODE || '::'||SQLERRM);  
end;

2 Java调用存储过程

Session session = getSessionFactory().openSession();
session.beginTransaction();
Connection conn = ((SessionImplementor)session).connection();
CallableStatement   proc   =   null; 
proc = conn.prepareCall("{call usp_ztest(?,?)}");
proc.setInt(1, 3);
proc.registerOutParameter(2, OracleTypes.CURSOR);
proc.executeUpdate();
ResultSet result = (ResultSet)proc.getObject(2);
while(result.next()){
 System.out.println(result.getString("name"));
}
session.getTransaction().commit();
session.close();




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值