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

Oracle 21c执行PL/SQL代码触发ORA-25137错误,求原因解释

ORA-25137: Data value out of range 错误原因及解决方法

问题分析

你遇到的ORA-25137错误,核心原因是直接使用CAST将JSON类型转换为VARCHAR2时,Oracle的序列化逻辑与你预期的长度计算方式不匹配。

虽然你指定了VARCHAR2(100),但CAST函数对JSON类型的转换默认按字节长度计算,而非字符长度。即使JSON内容的字符数远小于100,若数据库字符集为多字节编码(如AL32UTF8),或者JSON内部存储的元数据在序列化时占用了额外字节,就可能触发“数据值超出范围”的错误。

另外,Oracle的JSON类型存储的是解析后的结构化数据,直接CAST的转换逻辑不如专门的JSON序列化函数稳定,容易出现这类看似“长度足够”却报错的情况。

解决方法

方法1:使用专门的JSON序列化函数

替换CAST为Oracle原生的JSON_SERIALIZE函数,该函数专为JSON转字符串设计,能更准确地处理长度计算:

DECLARE
  b varchar2(100);
BEGIN
  select JSON_SERIALIZE(j AS VARCHAR2(100)) into b from t where id=1;
  DBMS_OUTPUT.PUT_LINE(b);
END;
/

方法2:明确指定CAST的长度单位

如果仍需使用CAST,可以明确指定长度单位为CHAR,确保按字符数计算长度:

DECLARE
  b varchar2(100);
BEGIN
  select cast(j as varchar2(100 CHAR)) into b from t where id=1;
  DBMS_OUTPUT.PUT_LINE(b);
END;
/

验证步骤

  1. 确认数据库字符集:执行以下语句查看当前字符集,若为多字节编码(如AL32UTF8),更易触发此问题:
SELECT value FROM nls_database_parameters WHERE parameter='NLS_CHARACTERSET';
  1. 检查JSON内容的实际长度:
-- 查看字符数
SELECT LENGTH(j) FROM t WHERE id=1;
-- 查看字节数
SELECT LENGTHB(j) FROM t WHERE id=1;

内容的提问来源于stack exchange,提问作者zl.Ao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:31:04