调用oracle存储过程,如何得到这样的返回值??

ahuu 2005-07-27 10:59:16
存储过程大致如下:

Type retstring is Record
(
a varchar2(6),
b varchar(10)
);

type retstr is table of retstring index by BINARY_INTEGER;

procedure getStr( ret out retstr )is
begin
...
loop
ret(i).a := a1;
ret(i).b := b1;
end loop;
...
end;

然后在java中调用该过程,并且得到ret的值

CallableStatement stmt = null;
stmt = con.prepareCall("{call sp_submitproc(?)}");//调用存储过程
stmt.setRef(1,rs); //这里的参数如何设置,并且rs这个变量如何定义??????
stmt.executeUpdate();

请指教!!
...全文
557 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
shoulders 2005-07-28
  • 打赏
  • 举报
回复
<>
shoulders 2005-07-28
  • 打赏
  • 举报
回复
<
hawaii_wx 2005-07-28
  • 打赏
  • 举报
回复
CallableStatement stmt = null;
stmt = con.prepareCall("{call sp_submitproc(?)}");//调用存储过程
stmt.setRef(1,rs); //这里的参数是实参,应该和procedure getStr( ret out retstr )is里面的ret类型一样而且你定义的是输出参数( ret out retstr )里面的out可以表示你定义的是输出参数,所以你这样的代码还不够,还得在java里面声明他是个输出参数,所以你应该定义个retstr类型得变量,来接收这个输出参数
stmt.executeUpdate();

试试下面的代码:(没测试,我手写的,但是大体思路应该是这样的)
CallableStatement stmt = null;
stmt = con.prepareCall("{call sp_submitproc(?)}");//调用存储过程
cs.registerOutParameter(1,java.sql.Types.retstr);
//这句表示你的输出参数是一个什么类型的
//参数,不过我只用过基本数据类型的,没用过自定义类型的,我不知道这样写对不对,反
//正java.sql.Types.retstr是表示你的输出参数的类型
stmt.execute();//执行存储过程
retstr rs=stmt.getObject(1);//用一个变量接收参数,
最后关闭东东。
最后rs里面就是你想要的东东了,不保证代码可以执行,但是是这个思路主要是你定义的那个参数是自定义类型的,我没用过,
下面是我写的一个sql2000里面的存储过程,可以执行,你可以看看
/**
*
* 写一个通过java创建sql2000的存储过程,存储过程带2个参数,一个为输入参数,一个为输出参数,并且输出参数
* 的值为输入参数的值的2倍,即输入参数为4,输出参数就为8,最后打印输出参数的值
*/
public class ProcdureDemo
{

public static void main(String[] args)
{
try
{
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
String url="jdbc:microsoft:sqlserver://localhost:1433;Databsse=pubs";
Connection con=DriverManager.getConnection(url,"sa","sa");
System.out.println("数据库已连接");
String proc="create procedure inout_proc"+" @in int,@out int output"+" as"+
" set @out=@in*2;";
/*这里为定义一个创建存储过程的字符串, */
Statement stmt=con.createStatement();
stmt.executeUpdate(proc);
/*执行创建存储过程的语句*/
System.out.println("存储过程已编译");

CallableStatement cs=con.prepareCall("{call inout_proc(?,?)}");
/*调用存储过程,请注意语法格式{}告诉jvm这是调用存储过程*/
cs.registerOutParameter(2,java.sql.Types.INTEGER);
/*这里表示告诉jvm第二个参数为输出型的参数,并且参数类型为int型*/
cs.setInt(1,3);
/*设置第一个参数的值*/
cs.execute();
int i=cs.getInt(2);
/*用变量接收存储过程输出参数的值*/

System.out.println("调用存储过程显示结果为:"+i);
cs.close();
con.close();
stmt.close();

}
catch (ClassNotFoundException e)
{
// TODO 自动生成 catch 块
e.printStackTrace();
}
catch (SQLException e)
{
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
}

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧