存储过程大致如下: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();请指教!!
(
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();请指教!!
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();
}
}
}