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

在IBM ACE中通过ESQL调用Oracle存储过程遇ORA-03146错误求助

解决IBM ACE调用Oracle存储过程时的ORA-03146错误

错误原因分析

ORA-03146是Oracle驱动返回的错误,核心原因是绑定变量的类型/长度与存储过程参数不匹配,尤其是OUT参数的缓冲区设置不符合Oracle的要求。结合你的场景,主要问题出在两点:

  • ESQL中用INTEGER类型映射Oracle的NUMBER OUT参数不合适:Oracle的NUMBER支持更大的数值范围和小数,而ESQL的INTEGER是32位整数,类型不兼容会导致缓冲区长度错误。
  • PASSTHRU调用存储过程时,未正确标记OUT参数,Oracle驱动无法识别参数方向,导致缓冲区分配错误。

修复后的ESQL代码

针对你的需求(接收查询参数、获取OUT参数和存储过程返回的记录集),修改ESQL如下:

DECLARE in_param CHARACTER;
SET in_param = InputLocalEnvironment.REST.Input.Parameters.in_param;

-- 用DECIMAL匹配Oracle的NUMBER类型,避免类型不兼容
DECLARE result DECIMAL;

CREATE FIELD OutputRoot.JSON.Data IDENTITY(JSON.Object);
CREATE FIELD OutputRoot.JSON.Data.output_param IDENTITY(JSON.Number);
CREATE FIELD OutputRoot.JSON.Data.record_set IDENTITY(JSON.Array);

-- 使用BEGIN...END块包裹存储过程调用,明确标记OUT参数
SET OutputRoot.JSON.Data.record_set.Item[] = 
    PASSTHRU(
        'BEGIN MY_SCHEMA.MY_PROC(?, ?); END;',
        in_param,
        OUT result -- 必须用OUT关键字标记输出参数
    );

-- 将OUT参数值写入JSON输出
SET OutputRoot.JSON.Data.output_param = result;

额外检查项

  • ODBC驱动配置:确认集成服务器使用的Oracle ODBC驱动版本(推荐Oracle Instant Client ODBC 12c+),odbc.ini中的数据源配置需包含正确的NLS_LANG(例如AMERICAN_AMERICA.AL32UTF8),避免字符集不匹配导致的隐性错误。
  • 存储过程返回记录集的方式:如果存储过程是通过SELECT语句返回记录集,需确认该SELECT是存储过程的最后执行语句,否则PASSTHRU可能无法捕获到记录集。
  • 部署测试:由于Toolkit无法直接连库,修改后务必部署到远程集成服务器再测试,避免本地Toolkit的语法检查干扰。

内容的提问来源于stack exchange,提问作者Victor Bita

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 12:12:19