And the java to use this could be: 
  import java.sql.*; 
import java.io.*; 
import oracle.jdbc.driver.*; 
  
class curvar 

  public static void main (String args []) 
                     throws SQLException, ClassNotFoundException 
  { 
      String driver_class = "oracle.jdbc.driver.OracleDriver"; 
      String connect_string = "jdbc:oracle:thin:@slackdog:1521:oracle8"; 
      String query = "begin :1 := sp_listEmp; end;"; 
      Connection conn; 
      Class.forName(driver_class); 
      conn = DriverManager.getConnection(connect_string, "scott", "tiger"); 
      CallableStatement cstmt = conn.prepareCall(query); 
      cstmt.registerOutParameter(1,OracleTypes.CURSOR); 
      cstmt.execute(); 
      ResultSet rset = (ResultSet)cstmt.getObject(1); 
      while (rset.next ()) 
        System.out.println( rset.getString (1) ); 
      cstmt.close(); 
  } 
}

解决方案 »

  1.   

    集合类型用java.sql.Array 或 oracle.sql.ARRAY不过为什么要向Java返回集合类型呢,个人感觉把多个数据放到cursor中,返回REF CURSOR 型,java端用普通的java.sql.ResultSet就可以了亚。
      

  2.   

    这个数据集不是存储在数据表中的,是经过一些列的处理和计算的结果,并包含一些错误信息和数据信息,具体说就是每一个处理使用了一个Record来整理各项信息,多个处理就使用集合类型来组织这些Record成一个列表。
      

  3.   

    比如这样的数据类型定义:
    Type Message is Record(
    error_code varchar2,
    data       varchar2,
    message    varchar2
    );
    Type Messages is table of Message;
      

  4.   

    这种需求我在上一个项目也遇到过。不过我不是用record解决的。
    我的方法是
    1 建立一个基于session的临时表。用你的例子
    CREATE GLOBAL TEMPORARY TABLE MsgInfo (
    error_code varchar2,
    data       varchar2,
    message    varchar2)
    ON COMMIT PRESERVE ROWS;
    注意表是事先建立好的,不是在存储过程中动态生成的。
    不要担心与别的用户的处理互相干扰,在你的session中插入的data只有你自己能看到。
    2 然后进行你的业务逻辑。比如处理1,处理2...
      当上述处理中有异常发生时,将相关信息插入到MsgInfo 中。
    3 在存储过程的最后,open 一个 cursor 并返回之。
      open cursor_name for select * from MsgInfo;
    4 在java端用resultset拿到结果集后,
       如果是0条记录的话,则整个处理正常结束。
       如果有记录的话,则有异常发生,具体的内容也到可以拿到。细节应该不用讲了吧。
      
    上述方法可以解决你的问题么。
      

  5.   

    谢谢楼上的。
    建临时表的方式我也考虑过,但是要增加一张表我要经过申请和审核才可以新增,如果能直接从Java中取到Record和Collection当然最好了,实在不行我也只能用临时表的方式了。