如何在Oracle SQL Developer中获取PL/SQL存储过程的结果集
解决Oracle SQL Developer中存储过程结果集无法显示的问题
步骤1:修正存储过程的语法错误
你的存储过程存在一处语法错误:赋值语句里的 v_sql:-'select...' 应改为 v_sql := 'select...'(PL/SQL的标准赋值运算符是 :=)。修正后的完整存储过程代码如下:
CREATE OR REPLACE PROCEDURE SP_GETDATA( id in number, result_cursor out sys_refcursor )AS BEGIN DECLARE v_sql varchar2(2000); BEGIN v_sql := 'select * from(select col1,col2,col3 from tab1) pivot (max(col3) for col1 in('; for i in (select col1 from tab2) LOOP v_sql:=v_sql||i.col1||','; END LOOP; v_sql:=RTRIM(v_sql,',')||')) ORDER BY col2'; OPEN result_cursor for v_sql; END; END ; /
执行这段代码重新编译存储过程,确保无编译报错。
步骤2:使用正确方式调用并显示结果集
方法A:用DBMS_SQL.RETURN_RESULT强制返回结果
通过匿名块调用存储过程,借助DBMS_SQL.RETURN_RESULT让SQL Developer直接展示游标结果:
DECLARE v_cursor SYS_REFCURSOR; BEGIN SP_GETDATA(1, v_cursor); DBMS_SQL.RETURN_RESULT(v_cursor); END; /
执行后SQL Developer会自动弹出结果集窗口。
方法B:在脚本模式下执行原调用命令
如果坚持使用VARIABLE+PRINT的方式,必须按**F5(Run Script)**执行以下代码,而非Ctrl+Enter(Run Statement):
VARIABLE cursor_test refcursor; exec SP_GETDATA(1,:cursor_test); print cursor_test;
Run Statement仅执行单条语句,无法按顺序完成变量声明、存储过程调用和结果打印,而Run Script会按脚本逻辑完整执行。
额外验证点
- 可以在存储过程中添加
DBMS_OUTPUT.PUT_LINE(v_sql);,开启SET SERVEROUTPUT ON;后执行调用,查看生成的动态SQL语句,复制后直接执行确认是否有结果。 - 当前存储过程的
id参数未参与动态SQL生成,若业务需要用该参数过滤数据,需在动态SQL中加入对应条件(如where id = '||:id),并在打开游标时绑定参数:OPEN result_cursor for v_sql using id;
内容的提问来源于stack exchange,提问作者codeseeker
相关产品推荐
相关产品推荐

