You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle 11g存储过程如何返回多个查询结果?(不使用dbms_sql.return_result)

在Oracle 11g存储过程中输出多条查询结果的方案

在Oracle 11g中,由于无法使用DBMS_SQL.RETURN_RESULT直接返回多个结果集,你提供的**输出游标(OUT SYS_REFCURSOR)**方案是完全可行的,这也是11g版本下实现该需求的标准方式。

你的存储过程代码验证

你编写的存储过程已经正确定义了两个输出游标,分别返回dba_objects和dba_segments的行数,建议给查询结果加别名提升可读性:

create or replace procedure get_rows_count
(
  cursor1 out SYS_REFCURSOR,
  cursor2 out SYS_REFCURSOR
)
as
begin
    open cursor1 for select count(*) obj_count from dba_objects;
    open cursor2 for select count(*) seg_count from dba_segments;
end get_rows_count;
/

如何调用这个存储过程

你可以通过PL/SQL块调用并获取结果:

declare
  v_obj_cursor SYS_REFCURSOR;
  v_seg_cursor SYS_REFCURSOR;
  v_obj_num number;
  v_seg_num number;
begin
  get_rows_count(v_obj_cursor, v_seg_cursor);
  
  -- 读取第一个游标结果
  fetch v_obj_cursor into v_obj_num;
  dbms_output.put_line('dba_objects行数: ' || v_obj_num);
  close v_obj_cursor;
  
  -- 读取第二个游标结果
  fetch v_seg_cursor into v_seg_num;
  dbms_output.put_line('dba_segments行数: ' || v_seg_num);
  close v_seg_cursor;
end;
/

如果使用SQL Developer、PL/SQL Developer这类工具,直接执行存储过程时,工具会自动弹出参数输入窗口,执行后将展示两个游标对应的结果集。

其他可选方案

如果不需要返回完整结果集,只是要计数数值,也可以直接定义多个OUT类型的数值变量:

create or replace procedure get_rows_count
(
  obj_count out number,
  seg_count out number
)
as
begin
    select count(*) into obj_count from dba_objects;
    select count(*) into seg_count from dba_segments;
end get_rows_count;
/

调用方式更简洁:

declare
  v_obj_num number;
  v_seg_num number;
begin
  get_rows_count(v_obj_num, v_seg_num);
  dbms_output.put_line('dba_objects行数: ' || v_obj_num);
  dbms_output.put_line('dba_segments行数: ' || v_seg_num);
end;
/

内容的提问来源于stack exchange,提问作者microracle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:00:31