为何带输入输出参数的Oracle存储过程在SSRS报表部署后报错
问题根因定位
你遇到的PLS-00306报错,本质是SSRS服务器端调用Oracle存储过程的参数匹配逻辑,和本地开发环境存在差异,结合你提到的测试现象(无参/单入参SP正常、带REF CURSOR输出就报错),具体触发原因可以归纳为几点:
- 本地开发工具(Visual Studio/Report Builder)生成存储过程调用语句时,会自动为存储过程的REF CURSOR类型输出参数补充隐式绑定;但SSRS服务器端使用的
System.Data.OracleClient托管驱动,不会自动识别需要输出的REF CURSOR参数,如果数据集查询仅填写存储过程名称,就会因为漏绑输出参数、参数数量不匹配触发报错。 - 对比无参、单入参SP的测试结果可以验证:不带REF CURSOR的存储过程不需要额外绑定输出参数,本地和服务器端生成的调用语句参数数量完全一致,因此运行正常;一旦SP新增REF CURSOR输出,本地会自动生成带两个参数的调用结构,服务器端如果没有显式配置参数绑定,就只会传递1个入参,漏传输出游标参数,直接触发PLS-00306的参数数量不匹配错误。
- 部分场景下,SSRS服务器安装的ODAC驱动版本和本地客户端版本不兼容,旧版ODAC对
System.Data.OracleClient的REF CURSOR类型映射存在缺陷,即使显式配置了参数,也可能因为类型识别错误触发同类报错。
对应解决步骤
- 替换数据集的查询语法,避免仅填写存储过程名称
把数据集原来的单存过程名查询,替换为Oracle原生PL/SQL块写法,显式声明所有参数的传递逻辑,不要使用兼容性较差的{call 存储过程名(?,?)}通用ODBC写法,示例如下:BEGIN get_name( :report_input_param, -- 对应存储过程的输入参数 :out_ref_cursor -- 对应存储过程的REF CURSOR输出参数 ); END; - 手动校验数据集的参数配置
进入数据集的参数设置页,逐一核对两个参数的配置:- 输入参数
report_input_param:方向设置为Input,数据类型和存储过程定义的入参类型完全匹配(比如SP入参是VARCHAR2就不要设置为整数类型),绑定对应的报表参数值 - 输出参数
out_ref_cursor:方向设置为Output,数据类型指定为Cursor类型,不要使用默认的字符串或其他数据类型
- 输入参数
- 修正SSRS服务器的驱动版本兼容问题
核对两个配置点排除驱动异常:- 将服务器端安装的ODAC版本,调整为和本地开发客户端完全一致的大版本,且32/64位和SSRS服务的进程位宽匹配(SSRS 2016及以上版本默认运行64位进程,需安装64位ODAC)
- 清理全局程序集缓存中旧版本的
System.Data.OracleClient.dll,避免SSRS服务加载到版本不匹配的托管驱动
- 排查权限类隐性异常
确认SSRS服务运行使用的Oracle账号,对目标存储过程拥有EXECUTE权限,权限不足会导致Oracle端无法正常解析存储过程的参数定义,间接触发PLS-00306报错。
内容的提问来源于stack exchange,提问作者user3588074
相关产品推荐
相关产品推荐

