怎么解析存储过程返回的结果集的列信息?

qq_29428051 2016-08-15 11:20:44
现有存储过程

create or replace procedure pro_test (ResultSet out sys_refcursor) is
begin
open po for 'select 1 id,''Tom'' nm from dual union all select 2 id,''Jack'' from dual';
end ;

现在假如我只知道存储过程名称pro_test,我可以通过user_arguments表查出参数,但是怎么才能获取到ResultSet 也就是结果集中的列信息呢
...全文
386 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_29428051 2016-08-31
  • 打赏
  • 举报
回复
最后通过用户手动输入模拟参数进行存储过程调用,参数合法即可,不用考虑结果集有没有数据,然后通过JAVA获取结果集的列信息
cnwz 2016-08-18
  • 打赏
  • 举报
回复
可以通过DBMS_SQL包对游标进行解析,使用方法 DBMS_SQL.DESCRIBE_COLUMNS 可获取结果列名、列类型(无法获取长度)等 具体直接参考技术文档
qq_29428051 2016-08-16
  • 打赏
  • 举报
回复
因为是展示一些数据,每个存储过程的结果集中的列应该是相对固定的,现考虑通过user_source获取存储过程内容,解析出open ResultSet for后面的查询语句,通过外部程序(java)执行并返回0条数据,然后解析列名称和列类型。不知道是不是可以,目前没有验证
ghx287524027 2016-08-15
  • 打赏
  • 举报
回复
引用 5 楼 qq_29428051 的回复:
[quote=引用 4 楼 ghx287524027 的回复:] 如果过程对你不可见的话,除非自己写个解析器,否则没法解析结果集中列的信息。。。。。
是要先读取存储过程内容,然后解析open ResultSet for后面的语句吗。。[/quote] 那这种也不完善呀,比如遇到了 if open ResultSet for else open ResultSet for end if; 这种结构呢……
qq_29428051 2016-08-15
  • 打赏
  • 举报
回复
引用 4 楼 ghx287524027 的回复:
如果过程对你不可见的话,除非自己写个解析器,否则没法解析结果集中列的信息。。。。。
是要先读取存储过程内容,然后解析open ResultSet for后面的语句吗。。
ghx287524027 2016-08-15
  • 打赏
  • 举报
回复
引用 3 楼 qq_29428051 的回复:
才发现存储过程写错了

create or replace procedure pro_test (ResultSet out sys_refcursor) is  
begin  
  open ResultSet for 'select 1 id,''Tom'' nm from dual union all select 2 id,''Jack'' from dual';  
end ; 
必须执行一遍才能获取结果集吗?能不能获取结果集中包含的字段名称以及字段类型?实际情况中存储过程参数可能比较多并且逻辑复杂,模拟不出合法的参数值
如果过程对你不可见的话,除非自己写个解析器,否则没法解析结果集中列的信息。。。。。
qq_29428051 2016-08-15
  • 打赏
  • 举报
回复
才发现存储过程写错了

create or replace procedure pro_test (ResultSet out sys_refcursor) is  
begin  
  open ResultSet for 'select 1 id,''Tom'' nm from dual union all select 2 id,''Jack'' from dual';  
end ; 
必须执行一遍才能获取结果集吗?能不能获取结果集中包含的字段名称以及字段类型?实际情况中存储过程参数可能比较多并且逻辑复杂,模拟不出合法的参数值
ghx287524027 2016-08-15
  • 打赏
  • 举报
回复
至于你要解析列的信息的话,貌似。。可能。。大概实现不了
ghx287524027 2016-08-15
  • 打赏
  • 举报
回复
写段测试代码
declare
v_rent_rows1 SYS_REFCURSOR;
v_rent_row table%rowType;
begin
pro_test(v_rent_rows1);
loop
fetch v_rent_rows1 into v_rent_row;
exit when v_rent_rows1%NOTFOUND;
Dbms_output.put_line(v_rent_row.col1||' '||v_rent_row.col2);
end loop;
close v_rent_rows1;
end;
qq_29428051 2016-08-15
  • 打赏
  • 举报
回复
引用 7 楼 wmxcn2000 的回复:
要返回列的名称吗?
要返回列名称和列类型
卖水果的net 2016-08-15
  • 打赏
  • 举报
回复
要返回列的名称吗?

17,086

社区成员

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

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