pl/sql存储过程返回record类型和集合类型(is table of record)的结果,Java里如何调用呢?

leolee 2004-09-13 03:15:07
pl/sql存储过程返回record类型和集合类型(is table of record)的结果,Java里如何调用呢?
...全文
912 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
baffling 2004-11-18
  • 打赏
  • 举报
回复
gz
leolee 2004-09-14
  • 打赏
  • 举报
回复
谢谢楼上的。
建临时表的方式我也考虑过,但是要增加一张表我要经过申请和审核才可以新增,如果能直接从Java中取到Record和Collection当然最好了,实在不行我也只能用临时表的方式了。
fightintokyo 2004-09-13
  • 打赏
  • 举报
回复
这种需求我在上一个项目也遇到过。不过我不是用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条记录的话,则整个处理正常结束。
如果有记录的话,则有异常发生,具体的内容也到可以拿到。细节应该不用讲了吧。

上述方法可以解决你的问题么。
leolee 2004-09-13
  • 打赏
  • 举报
回复
比如这样的数据类型定义:
Type Message is Record(
error_code varchar2,
data varchar2,
message varchar2
);
Type Messages is table of Message;
leolee 2004-09-13
  • 打赏
  • 举报
回复
这个数据集不是存储在数据表中的,是经过一些列的处理和计算的结果,并包含一些错误信息和数据信息,具体说就是每一个处理使用了一个Record来整理各项信息,多个处理就使用集合类型来组织这些Record成一个列表。
fightintokyo 2004-09-13
  • 打赏
  • 举报
回复
集合类型用java.sql.Array 或 oracle.sql.ARRAY

不过为什么要向Java返回集合类型呢,个人感觉把多个数据放到cursor中,返回REF CURSOR 型,java端用普通的java.sql.ResultSet就可以了亚。
myrou 2004-09-13
  • 打赏
  • 举报
回复
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();
}
}


17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧