SSRS调用Oracle 19c函数报错求助:原Oracle 12c环境运行正常
将SSRS报表数据源从Oracle 12c迁移至19c后,调用返回REF CURSOR的Oracle函数时出现执行错误。旧环境(Oracle 12c + SSRS报表生成器v12)中,只需将数据集「查询类型」设为「存储过程」,直接输入带参数的函数名称即可正常运行;但新环境(Oracle 19c + SSRS报表生成器v15 + Oracle OLEDB客户端)执行时抛出以下错误:
报表处理期间出错。(rsProcessingAborted)
数据集‘region’的查询执行失败。(rsErrorExecutingCommand)
ORA-06550: line1, column 7: PLS-00221: '<>' 不是过程或未定义 ORA-06550:line1, column7: PL/SQL: statement ignored.
补充细节:
- 新环境下将数据源设为SQL查询时,数据集可正常工作
- 尝试调用简单测试函数
GET_FUNC_TEST,仍出现相同错误
针对SSRS调用Oracle 19c返回REF CURSOR的函数,需调整数据集配置方式,具体操作如下:
切换查询类型为「文本」
新版本SSRS与Oracle 19c的OLEDB驱动兼容逻辑发生变化,不再支持通过「存储过程」类型直接调用函数,必须切换为「文本」类型,通过PL/SQL块显式调用并返回游标。编写PL/SQL调用语句
假设目标函数为GET_REGION(p_param IN VARCHAR2) RETURN SYS_REFCURSOR,在数据集的查询文本中输入如下代码:DECLARE v_cur SYS_REFCURSOR; BEGIN v_cur := GET_REGION(?); -- 问号对应SSRS参数,按顺序匹配 DBMS_SQL.RETURN_RESULT(v_cur); END;若上述写法不生效,可尝试另一种兼容格式:
BEGIN :out_cur := GET_REGION(?); END;使用第二种写法时,需在数据集的「参数」设置中添加一个输出参数:参数名称设为
out_cur,数据类型选「游标」,方向设为「输出」。匹配Oracle客户端版本
确保新环境使用的Oracle OLEDB客户端版本与Oracle 19c数据库版本一致,避免因版本不匹配导致的调用逻辑异常。验证函数权限与可用性
确认SSRS使用的数据库账号对目标函数拥有EXECUTE权限,同时在Oracle 19c环境中直接调用函数(如通过PL/SQL Developer),验证函数本身可正常返回游标。
内容的提问来源于stack exchange,提问作者KS_23

