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

解决方案 »

  1.   

    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();
            }
        }
    }