JDBC从一开始就支持存储过程的访问,也支持多个RESULTSET
调用execue执行后,可调用getMoreResults()来判断有没有返回结果集,如果有则调用getResultSet() 返回一个结果集,JDBC和JDBC2都需要相应的支持,如果你没有相应的
Driver也没用仅供参考          

解决方案 »

  1.   

    数据库版本是什么?试下oracle jdbc driver 8.1.6吧.最好是用jdbc oci驱动,jdbc thin有些类型不支持.:)
      

  2.   

    数据库版本Oracle 8i, 我用的是 jdbc thin.
    请问jdbc thin 哪些类型不支持?  
    我想问 上面的存储过程返回的不是cursor,  而是表类型.
    这一点我很糊涂!用什么方法取得表类型.
    ASP里面,返回多个cursor是可以的. 
    jdbc 里的多个cursor  methods execute, getMoreResults, getResultSet,
    我也知道.不过似乎还是很糊涂!
    讲清楚点好吗?
    再道一声谢了!
      

  3.   


    以下例子在oracle8.05调试通过/*
     * This sample shows how to call PL/SQL blocks from JDBC.
     */import java.sql.*;class PLSQL
    {
      public static void main (String args [])
           throws SQLException, ClassNotFoundException
      {
        // Load the driver
    Connection conn = null;
    DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
    try
    {
    conn = DriverManager.getConnection ("jdbc:oracle:thin:@myserver:1521:test", "system", "manager");
    }
    catch(Exception e)
    {
    e.printStackTrace(System.out);
    }    // Create the stored procedures
        init (conn);    // Cleanup the plsqltest database
        Statement stmt = conn.createStatement ();
        stmt.execute ("delete from plsqltest");
        
        // Call a procedure with no parameters
        {
          CallableStatement procnone = conn.prepareCall ("begin procnone; end;");
          procnone.execute ();
          dumpTestTable (conn);
        }    // Call a procedure with an IN parameter
        {
          CallableStatement procin = conn.prepareCall ("begin procin (?); end;");
          procin.setString (1, "testing");
          procin.execute ();
          dumpTestTable (conn);
        }    // Call a procedure with an OUT parameter
        {
          CallableStatement procout = conn.prepareCall ("begin procout (?); end;");
          procout.registerOutParameter (1, Types.CHAR);
          procout.execute ();
          System.out.println ("Out argument is: " + procout.getString (1));
        }
        
        // Call a procedure with an IN/OUT prameter
        {
          CallableStatement procinout = conn.prepareCall ("begin procinout (?); end;");
          procinout.registerOutParameter (1, Types.VARCHAR);
          procinout.setString (1, "testing");
          procinout.execute ();
          dumpTestTable (conn);
          System.out.println ("Out argument is: " + procinout.getString (1));
        }    // Call a function with no parameters
        {
          CallableStatement funcnone = conn.prepareCall ("begin ? := funcnone; end;");
          funcnone.registerOutParameter (1, Types.CHAR);
          funcnone.execute ();
          System.out.println ("Return value is: " + funcnone.getString (1));
        }    // Call a function with an IN parameter
        {
          CallableStatement funcin = conn.prepareCall ("begin ? := funcin (?); end;");
          funcin.registerOutParameter (1, Types.CHAR);
          funcin.setString (2, "testing");
          funcin.execute ();
          System.out.println ("Return value is: " + funcin.getString (1));
        }    // Call a function with an OUT parameter
        {
          CallableStatement funcout = conn.prepareCall ("begin ? := funcout (?); end;");
          funcout.registerOutParameter (1, Types.CHAR);
          funcout.registerOutParameter (2, Types.CHAR);
          funcout.execute ();
          System.out.println ("Return value is: " + funcout.getString (1));
          System.out.println ("Out argument is: " + funcout.getString (2));
        }
      }  // Utility function to dump the contents of the PLSQLTEST table and
      // clear it
      static void dumpTestTable (Connection conn)
        throws SQLException
      {
        Statement stmt = conn.createStatement ();
        ResultSet rset = stmt.executeQuery ("select * from plsqltest");
        while (rset.next ())
          System.out.println (rset.getString (1));
        stmt.execute ("delete from plsqltest");
      }  // Utility function to create the stored procedures
      static void init (Connection conn)
        throws SQLException
      {
        Statement stmt = conn.createStatement ();
        try { stmt.execute ("drop table plsqltest"); } catch (SQLException e) { }
        stmt.execute ("create table plsqltest (x char(20))");
        stmt.execute ("create or replace procedure procnone is begin insert into plsqltest values ('testing'); end;");
        stmt.execute ("create or replace procedure procin (y char) is begin insert into plsqltest values (y); end;");
        stmt.execute ("create or replace procedure procout (y out char) is begin y := 'tested'; end;");
        stmt.execute ("create or replace procedure procinout (y in out varchar) is begin insert into plsqltest values (y); y := 'tested'; end;");    stmt.execute ("create or replace function funcnone return char is begin return 'tested'; end;");
        stmt.execute ("create or replace function funcin (y char) return char is begin return y || y; end;");
        stmt.execute ("create or replace function funcout (y out char) return char is begin y := 'tested'; return 'returned'; end;");
      }
    }
      

  4.   

    斑竹同志, 
          你的例子我很久以前就已经通过了.
          我的问题似乎不是这样的!你的热情帮助我很感谢!
          或者哪位朋友再不嫌麻烦帮帮我?!
          请再看一下我的code,好吗 ?      谢谢啦!!
      

  5.   

    问题在于用registerOutParameter方法时,类型总是会有问题!
    PLS-00306: wrong number or types of arguments in call to 'GET_TITLE_LIST'
    store procedure GET_TITLE_LIST的返回参数为
    get_title_list(pi_search_term IN VARCHAR2, pi_partner_id IN VARCHAR2,
     po_pub_id OUT tbl_pub_id,po_publication_name OUT tbl_publication_name,
     po_series_root_url OUT tbl_series_root_url,  po_series_name OUT 
    tbl_series_name, po_series_id OUT tbl_series_id, po_ISBN OUT tbl_ISBN)
    输入参数很好办:SetString就可以啦,出参数如果是VARCHAR,或,其他的简单类型也好办.
    但是, tbl_publication_name之类的类型怎么办??
      

  6.   

    欢迎到“软件开发者”——“Visual C++”——“严肃讨论...”参加讨论 
      

  7.   

    我现在可能要改写store procedure来让它在JDBC中运行了.
    不过,     还是要感谢斑竹同志 !