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

Oracle中如何将存储过程返回的REF CURSOR以表格形式查看

嘿,这个问题我经常碰到——REF CURSOR本质就是个指向结果集的指针,直接打印肯定看不到实际数据。下面分几种常用场景给你讲怎么把它转成清晰的表格展示:

1. 在SQL*Plus/SQLcl中快速展示

SQL*Plus和Oracle官方的SQLcl对REF CURSOR有原生支持,只需要几个简单步骤就能输出表格:

首先先写个示例存储过程(方便演示):

CREATE OR REPLACE PROCEDURE get_emp_details(p_dept_id IN NUMBER, p_emp_cursor OUT SYS_REFCURSOR)
IS
BEGIN
    OPEN p_emp_cursor FOR
        SELECT emp_id, emp_name, salary, hire_date
        FROM employees
        WHERE dept_id = p_dept_id;
END;
/

然后在SQL*Plus/SQLcl里执行以下操作:

-- 声明一个绑定变量来接收游标
VAR emp_cursor REFCURSOR;

-- 调用存储过程,把游标赋值给绑定变量
EXEC get_emp_details(10, :emp_cursor);

-- 打印游标结果,工具会自动格式化成表格
PRINT emp_cursor;

执行完PRINT命令后,你就能看到带列名、对齐整齐的表格结果了,和直接执行SELECT语句的输出格式一致。

2. 在PL/SQL Developer/TOAD等GUI工具中展示

这些GUI工具更省心,几乎不用额外操作:

写一个匿名块调用存储过程:

DECLARE
    v_emp_cursor SYS_REFCURSOR;
BEGIN
    get_emp_details(10, v_emp_cursor);
END;
/

运行这个块后,工具会自动识别到OUT参数是REF CURSOR,弹出一个窗口展示表格化的结果。或者你也可以选中v_emp_cursor变量,右键选择“Print”直接查看。

3. 手动用PL/SQL代码模拟表格输出

如果没有GUI工具,又想在DBMS_OUTPUT里看到类似表格的效果,可以手动遍历游标并格式化输出:

DECLARE
    v_emp_cursor SYS_REFCURSOR;
    v_emp_id     employees.emp_id%TYPE;
    v_emp_name   employees.emp_name%TYPE;
    v_salary     employees.salary%TYPE;
    v_hire_date  employees.hire_date%TYPE;
BEGIN
    get_emp_details(10, v_emp_cursor);
    
    -- 打印表头,用RPAD控制列宽对齐
    DBMS_OUTPUT.PUT_LINE(RPAD('EMP_ID', 10) || RPAD('EMP_NAME', 20) || RPAD('SALARY', 10) || 'HIRE_DATE');
    -- 打印分隔线
    DBMS_OUTPUT.PUT_LINE(RPAD('-', 10, '-') || RPAD('-', 20, '-') || RPAD('-', 10, '-') || RPAD('-', 10, '-'));
    
    -- 遍历游标,逐行打印数据
    LOOP
        FETCH v_emp_cursor INTO v_emp_id, v_emp_name, v_salary, v_hire_date;
        EXIT WHEN v_emp_cursor%NOTFOUND;
        
        DBMS_OUTPUT.PUT_LINE(
            RPAD(v_emp_id, 10) || 
            RPAD(v_emp_name, 20) || 
            RPAD(v_salary, 10) || 
            TO_CHAR(v_hire_date, 'YYYY-MM-DD')
        );
    END LOOP;
    
    CLOSE v_emp_cursor;
END;
/

记得先执行SET SERVEROUTPUT ON;打开输出开关,这样就能看到自己格式化的“表格”了——虽然不如工具自动生成的美观,但足够清晰。

额外提示

如果是在应用程序(比如Java、Python)中调用存储过程,只需要用对应的数据库驱动获取REF CURSOR的结果集,然后在应用层渲染成表格即可(比如Java用ResultSet遍历,Python用cx_Oracle获取cursor后转成DataFrame)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:12:23