如何在Oracle SQL Developer工作表查看存储过程游标返回结果
问题说明
现有存储过程定义如下,包含1个默认值为NULL的VARCHAR2类型入参inParam,1个SYS_REFCURSOR类型出参cur:
PROCEDURE do_stg(inParam IN VARCHAR2 := NULL, cur OUT SYS_REFCURSOR) AS BEGIN OPEN cur FOR WITH a AS ( SELECT * FROM aaa WHERE ccc = inParam), b as (SELECT * FROM bbb) SELECT a.xField, b.yField END do_stg;
因特殊限制无法直接修改原存储过程,需要在Oracle SQL Developer工作表中测试调整后的逻辑,直接在网格视图查看运行结果,且不接受自定义记录类型逐列匹配游标结构的实现方式。
最初编写的测试代码无法正常输出结果,需要定位问题并给出可行方案。
原有写法的问题
你最初写的测试代码如下:
DECLARE inParam VARCHAR(50) BEGIN WITH a AS ( SELECT * FROM aaa WHERE ccc = inParam), b as (SELECT * FROM bbb) SELECT a.xField, b.yField END;
这段代码跑不通、看不到结果的原因有两个:
- 基础语法错误:DECLARE块里定义
inParam后没加分号;PL/SQL块内的SELECT语句必须带INTO子句接收查询结果,不能直接裸写SELECT。 - 不符合SQL Developer的结果渲染规则:SQL Developer只会把两类查询结果自动渲染到网格:一是不包裹在PL/SQL块里的顶层直接SELECT语句,二是绑定到客户端REFCURSOR类型变量的游标输出。你写的PL/SQL块既没有把查询结果传给客户端可识别的变量,也没有触发结果输出动作,自然看不到网格结果。
额外提一句:你贴的原存储过程SQL里,a、b两个CTE结果没写关联条件,直接查会出笛卡尔积,测试的时候记得补全实际关联逻辑。
无需自定义类型的实现方案
用SQL Developer原生支持的客户端绑定游标变量就行,不需要建任何临时对象,不需要逐列定义返回结构,执行完效果和直接跑SELECT完全一致,结果自动出现在网格里。
测试修改后的自定义逻辑
在工作表里按顺序执行下面的语句即可:
-- 定义客户端级别的REFCURSOR绑定变量,这是SQL Developer原生支持的命令,不属于PL/SQL语法 VARIABLE cur REFCURSOR; -- 写PL/SQL块,把要测试的逻辑放进去,打开游标赋值给上面定义的绑定变量 DECLARE -- 在这里给入参赋值就能测不同场景,要测默认NULL场景就赋值为NULL inParam VARCHAR2(50) := NULL; BEGIN OPEN :cur FOR WITH a AS ( SELECT * FROM aaa WHERE ccc = inParam), b as (SELECT * FROM bbb) -- 记得补全a、b的关联条件,比如a.rel_id = b.id SELECT a.xField, b.yField FROM a JOIN b ON a.rel_id = b.id; END; / -- 打印游标,SQL Developer会自动解析游标返回的列结构,直接渲染成结果网格 PRINT cur;
直接调用原存储过程测试
如果不需要改逻辑,只是验证原存储过程的返回,代码更简单:
VARIABLE cur REFCURSOR; -- 传入要测试的入参值即可 EXEC do_stg(inParam => '测试参数', cur => :cur); PRINT cur;
这个方案完全不需要自定义记录类型匹配游标列,SQL Developer会自动读取游标返回的元数据生成网格,完全满足需求。
内容的提问来源于stack exchange,提问作者bbb android
相关产品推荐
相关产品推荐

