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();
}
}
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();
}
}
Type Message is Record(
error_code varchar2,
data varchar2,
message varchar2
);
Type Messages is table of Message;
我的方法是
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条记录的话,则整个处理正常结束。
如果有记录的话,则有异常发生,具体的内容也到可以拿到。细节应该不用讲了吧。
上述方法可以解决你的问题么。
建临时表的方式我也考虑过,但是要增加一张表我要经过申请和审核才可以新增,如果能直接从Java中取到Record和Collection当然最好了,实在不行我也只能用临时表的方式了。