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
相关产品推荐
相关产品推荐

