我就不多说了
...
StringBuffer sql = new StringBuffer("SELECT name,... FROM ....");
pstmt = conn.prepareStatement(sql.toString());
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
   System.out.println(rs.get("name"));
   ...
}

解决方案 »

  1.   

    第一:这么调还用存储过程干吗,faint
    第二:用StringBuffer定义一个串,然后又去toString,简直是画蛇添足。存储过程是数据库自己定义的,我只想去调用它。比如
    CREATE  OR REPLACE  PROCEDURE  test_proc( 
            v_id  OUT  students.id%TYPE, 
            v_first_name  OUT  students.first_name%TYPE, 
            v_last_name  OUT  students.last_name%TYPE)   
    AS 
    CURSOR mycur IS 
    SELECT id,first_name,last_name from students; 
    BEGIN 
        OPEN  mycur;
        FETCH  mycur INTO v_id,v_first_name,v_last_name; 
        WHILE  mycur%FOUND  LOOP 
        FETCH  mycur INTO v_id,v_first_name,v_last_name; 
        END  LOOP; 
    END  test_proc; 
    /
    可是怎么调都不行,是不是要想定义查询就不能这么定义呀?
      

  2.   

    请问用存储过程得到ResultSet,比一般的select得到好在哪里?好像没有看到过这样的用法。
      

  3.   

    万事无绝对,它有它的好处,PL/SQL也很值得一学。
      

  4.   

    哦!昨天没看清楚题目,不好意思!
    之所以用StringBuffer在于sql语句一般是在不同的条件下拼成的,换句话说,就是经常变化,所以StringBuffer要比String效率高些,你要是经常用java的话,我想是应该知道的。
    现在说说你的问题,我以前没有在java的sql语句中用过这样的东西,你想想,如果你的程序只是为了使用一次!因为是create一个表,我想你只会调用一次的,这不像update等。为此专门写个方法?你是不是觉得有些浪费?一般在程序里面调用的多半是什么select,update,insert,deleted这样的东东。不知道你对我的想法有什么意见。
      

  5.   

    Stored procedure with Input/Output parms and a ResultSet
    Thanks to T. Guirado for the tips. public static int storedProcWithResultSet (String parms) throws Exception
      // Stored procedure to be called.
      CallableStatement cs = conn.prepareCall
      ("{? = call mypackage.p_astoreproc (?,?,?,?,?,?,?)}");   // register input parameters
      cs.registerOutParameter(1, java.sql.Types.INTEGER); // return code
      cs.setString(2, "");  
      cs.setString(3, "");    
      cs.setString(4, parms);    
      // regsiter ouput parameters 
      cs.registerOutParameter(5, java.sql.Types.CHAR);    
      cs.registerOutParameter(6, java.sql.Types.CHAR);    
      cs.registerOutParameter(7, java.sql.Types.CHAR);      // Procedure execution 
      ResultSet rs = cs.executeQuery();  // Note that you need to retrieve the ResultSet _before_ retrieving
      // OUTPUT parameters.
      if ( rs == null)
        System.out.println( "No resultSet!"); 
      else { 
        // To retrieve columns info.
        ResultSetMetaData rsmd = rs.getMetaData(); 
        int nbCol = rsmd.getColumnCount(); 
              
        int i = 0; 
        int j = 1; 
                
        Vector vResSet = new Vector(); 
        while (rs.next ()) { 
          System.out.println( "Record " + (i+1)); 
          // putting the ResultSet columns in a vector
          for ( j = 1; j <= nbCol ; j++){ 
            vResSet.insertElementAt(rs.getString(j), 0); 
            vResSet.addElement(rs.getString(j));
            }       // Reading vector to print ResultSet data
          for ( int k = 0 ; k < nbColonnes ; k++ ) { 
          if ( vResSet.elementAt(k) != null) 
              System.out.println( vResSet.elementAt(k).toString()); 
          else 
              System.out.println( "Column " + (k+1) + " Null"); 
              } 
          i++; 
          } 
        }     // Retrieving Strored Procedure OUTPUT parameters
        System.out.println( "return code of Stored procedure = : " + cs.getInt(1));
          
        //  Retrieving OUTPUT parameters
        for ( int i = 5 ; i <= 7; i ++)    
          System.out.println( "parameter " + i + " : " + cs.getString(i));     return cs.getInt(1); 

      

  6.   

    据我所知,没有数据库有这种功能,存储过程返回的是一个变量,而不是JAVA中的对象。registerOutParameter方法中的参数中java.sql.Types中也没有ResultSet。还是通过preparedStatement返回ResultSet比较好
      

  7.   

    to :jcww(呱呱) 
    你贴出来的和我手头的例子是一样的,但是我想知道这个例子调用的存储过程是怎么写的?如果你有,能不能贴出来让小弟看看,谢谢
    其它人我就不说了, 你们说的和我以前的想法一样。
      

  8.   

    什么?你的意思就是要把select出来的东西存放起来?晕倒!
      

  9.   

    to shihb()
    是不是放在Vector里面只是别人一种写法而已,做实验嘛,有什么可奇怪的。faint,我关心的是它为什么能获得ResultSet对象,那个存储过程是怎么写的。
    大家不要忽视重点而去看一些不合理的地方。
      

  10.   

    什么是获得一个ResultSet对象?只要你使用了正确的executeQuery()方法,你就可以得到一个ResultSet!如果你想取得其中的内容,用ArrayList,Vector,Hashtable,HashMap等都可以呀!
    刚在口气可能重了些,不好意思!主要是讨论问题嘛!呵呵!
      

  11.   

    Connection        conn  = null ;
    CallableStatement cstmt = null ;
    ResultSet         rs    = null ;
    String spa = " { call test_proc } ";//test_proc是你的存储过程
    conn = getConnection();
    cstmt = conn.prepareCall(spa);
    rs = cstmt.executeQuery();
    rs.next();
    String strWelcome = rs.getString(1);
    ......
      

  12.   

    To zhou1977 (短笛) :
    据我的经验知道,Oracle 中的存储过程是不能返回记录集的,相关的Oracle返回记录集的东西你可以参考帖子:
    http://www.csdn.net/Expert/TopicView2.asp?id=330015&datebasetype=now
      

  13.   

    http://www.csdn.net/expert/topic/330/330015.xml?temp=.6432917
      

  14.   

    to  yakuu(享受孤独) 
    你的test_proc这个存储过程是怎么写的?谢谢
    to shihb() 
    你说了半天,能告诉我怎样通过executeQuery()执行oralce定义的存储过程得到一个ResutlSet吗?如果你不会,就关注好了。用SQL大家都会,不用再讨论了,还有并没有人关心怎么存内容,列出来这么多类,累不累呀?
    在java版问数据库的问题真累,在Oracle版问那帮人会java的又不多,不爽。
      

  15.   

    to  yakuu(享受孤独) 
    你的test_proc这个存储过程是怎么写的?谢谢
    to shihb() 
    你说了半天,能告诉我怎样通过executeQuery()执行oralce定义的存储过程得到一个ResutlSet吗?如果你不会,就关注好了。用SQL大家都会,不用再讨论了,还有并没有人关心怎么存内容,列出来这么多类,累不累呀?
    在java版问数据库的问题真累,在Oracle版问那帮人会java的又不多,不爽。
      

  16.   

    to  yakuu(享受孤独) 
    你的test_proc这个存储过程是怎么写的?谢谢
    to shihb() 
    你说了半天,能告诉我怎样通过executeQuery()执行oralce定义的存储过程得到一个ResutlSet吗?如果你不会,就关注好了。用SQL大家都会,不用再讨论了,还有并没有人关心怎么存内容,列出来这么多类,累不累呀?
    在java版问数据库的问题真累,在Oracle版问那帮人会java的又不多,不爽。
      

  17.   

    如果返回的是游标,可否用ResutlSet得到?? 随便问问!!
      

  18.   

    to  6leaf (大猩猩)  
    你推荐的那个帖子,我看过,我的那个存储过程写法也是从你那里抄袭来的,不好意思,呵呵,谢谢。
    看来你是比较有经验的了,最后没有做成功吗?
      

  19.   

    to shihb()
    不是不欢迎,是希望你不要转移大家的视线和注意力,你可以看到,不光是我,同样也有好多网友在关心这个问题。呵呵。
    调用存储过程有它的好处,否则大家还研究它干嘛?我们不能只看到我的要求很简单,就能够返回一个ResultSet而已,我们应该看到如果这个实现了,我们就能简单地调用存储过程来实现SQL不能简单实现的复杂工作。
      

  20.   

    To  zhou1977(短笛) :
    我的那个做法是可行的,只是我当时对Oracle的存储过程不是很熟悉,一开始希望可以像SQL Server那样直接通过存储过程来获得记录集,也想知道更多的方法而已,但其实这样的想法对Oracle是行不通的,必须采用Package、package body来实现返回记录集!
    Good luck!