一、Java调用存储Oracle存储过程

  测试用表:  

--创建用户表
create table USERINFO
(
  username VARCHAR2(50) not null,
  password VARCHAR2(50) not null,
  email    VARCHAR2(50) not null
)

 

  1、调用输入参数的存储过程,无返回值

--添加用户记录
create or replace procedure pro_userinfo_insert(username VARCHAR2,password VARCHAR2,email VARCHAR2) is
begin
  INSERT INTO userinfo VALUES(username,password,email);
  COMMIT;
end pro_userinfo_insert;

  调用

//省略jdbc其他代码

//调用存储过程
CallableStatement call = con.prepareCall("{call pro_userinfo_insert(?,?,?)}");
//传递参数
call.setString(1, "wangwu");
call.setString(2, "123123");
call.setString(3, "wangwu@163.com");
//执行方法,调用存储过程
int result = call.executeUpdate();
//返回受影响的行数
System.err.println(result);

 

  2、调用带输出参数的存储过程,返回单个值

--获取用户的记录总数
create or replace procedure pro_userinfo_SelectCount(
  v_count OUT INT
)is
begin
  SELECT COUNT(*) INTO v_count FROM Userinfo;
end pro_userinfo_SelectCount;

  调用代码

//调用存储过程
CallableStatement call = con.prepareCall("{call pro_userinfo_selectcount(?)}");
//传递参数
call.registerOutParameter(1, Types.INTEGER);
call.execute();
System.out.println(call.getInt(1));

 

  注意,这里的proc.getInt(1)中的数值1并非任意的,而是和存储过程中的out列对应的,如果out是在第二个位置,那就是proc.getInt(2),如果是第三个位置,就是proc.getInt(3),当然也可以同时有多个返回值,那就是再多加几个out参数了。

  

  3、返回列表的存储过程

  由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分。

  创建游标类型:

--声明一个包,在包中声明公共的游标类型
create or replace package shop_package IS
  --声明一个游标类型
  TYPE ref_cursor IS REF CURSOR;
end shop_package;

  创建带游标的存储过程:

--带输出游标的存储过程,参数类型为刚才创建的包中的游标类型
create or replace procedure pro_userinfo_select(cur OUT shop_package.ref_cursor) is
begin
    --游标进行绑定查询的sql语句
    OPEN cur FOR SELECT * FROM userinfo;
end pro_userinfo_select;

  Java调用代码

//调用存储过程
CallableStatement call = con.prepareCall("{call pro_userinfo_select(?)}");
//设置输出参数类型为游标类型
call.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
call.execute();
//将游标类型转换为数据集,然后遍历数据集即可
ResultSet rs = (ResultSet) call.getObject(1);
System.out.println("姓名\t\t邮箱");
while(rs.next()){
    System.out.println(rs.getString(1) + "\t\t" + rs.getString(3));
}

 

二、Java调用函数

  1、调用函数,返回单个值

--根据用户名称获取Email函数,返回字符串格式
create or replace function fun_userinfo_selectEmail(v_username varchar2) 
  return varchar2 
is
  v_email VARCHAR2(50);
begin
  SELECT email INTO v_email FROM Userinfo WHERE username=v_username;
  return(v_email);
end fun_userinfo_selectEmail;

  Java调用

//调用函数
CallableStatement call = con.prepareCall("{?=call fun_userinfo_selectemail(?)}");  //这里必须使用{},否则会报错!
//设置参数,1为函数返回值,2为传递到函数中的参数
call.registerOutParameter(1, Types.VARCHAR);
call.setString(2, "zhangsan");
call.execute();
System.out.println(call.getString(1));

 

  2、调用返回游标的函数

--返回游标类型的函数,游标为前面在包中定义的游标类型
create or replace function fun_userinfo_select return shop_package.ref_cursor is
   ref_cur shop_package.ref_cursor;
begin
  OPEN ref_cur FOR SELECT * FROM userinfo;
  return(ref_cur);
end fun_userinfo_select;

  Java调用

//调用函数
CallableStatement call = con.prepareCall("{?=call fun_userinfo_select()}");
//设置返回值类型为游标
call.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
call.execute();

ResultSet rs = (ResultSet) call.getObject(1);
System.out.println("姓名\t\t邮箱");
while(rs.next()){
    System.out.println(rs.getString(1) + "\t\t" + rs.getString(3));
}

 

posted on 2015-01-28 13:24  Builder  阅读(622)  评论(0编辑  收藏  举报