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

Oracle 23ai中JSON构造器转换PL/SQL记录时截断长字段名问题问询

Oracle 23ai中PL/SQL记录转JSON时键被截断的问题解析与解决方法

问题描述

在Oracle 23ai中,使用JSON(...)构造器将PL/SQL记录转换为JSON时,长记录成员名会被截断并追加文字...。该问题并非显示层面的问题,JSON_OBJECT_T.has()函数仅能匹配截断后的键名。例如成员名THIS_IS_AN_EXCEPTIONALLY_LONG_RECORD_FIELD_NAME_TO_TEST_JSON_RECORD_CONVERSION_TRUNCATION_BEHAVIOUR_ABCDEF会被缩短为THIS_IS_AN_EXCEPTIONALLY_...。

环境

  • Oracle Database 23ai Enterprise Edition Release 23.0.0.0.0 - for Oracle Cloud and Engineered Systems Version 23.9.0.25.08
  • PL/SQL服务端代码
  • 使用DBMS_OUTPUT展示结果

最小复现示例

DECLARE
  TYPE t_rec IS RECORD (
    THIS_IS_AN_EXCEPTIONALLY_LONG_RECORD_FIELD_NAME_TO_TEST_JSON_RECORD_CONVERSION_TRUNCATION_BEHAVIOUR_ABCDEF VARCHAR2(100) := 'hello'
  );
  r t_rec;
  j JSON;
  o JSON_OBJECT_T;
BEGIN
  j := JSON(r);
  o := JSON_OBJECT_T(j);

  DBMS_OUTPUT.put_line('has full: ' ||
    CASE WHEN o.has('THIS_IS_AN_EXCEPTIONALLY_LONG_RECORD_FIELD_NAME_TO_TEST_JSON_RECORD_CONVERSION_TRUNCATION_BEHAVIOUR_ABCDEF')
         THEN 'YES' ELSE 'NO' END);

  DBMS_OUTPUT.put_line('has short: ' ||
    CASE WHEN o.has('THIS_IS_AN_EXCEPTIONALLY_...')
         THEN 'YES' ELSE 'NO' END);

  DBMS_OUTPUT.put_line('json: ' || o.to_string);
END;
/

输出:

has full: NO
has short: YES
json: {"THIS_IS_AN_EXCEPTIONALLY_...":"hello"}

对比验证

通过SQL语句生成的JSON会保留完整字段名:

SELECT JSON_OBJECT(t.*)
FROM (
  SELECT 'hello' AS THIS_IS_AN_EXCEPTIONALLY_LONG_RECORD_FIELD_NAME_TO_TEST_JSON_RECORD_CONVERSION_TRUNCATION_BEHAVIOUR_ABCDEF
  FROM dual
) t;

输出:

{"THIS_IS_AN_EXCEPTIONALLY_LONG_RECORD_FIELD_NAME_TO_TEST_JSON_RECORD_CONVERSION_TRUNCATION_BEHAVIOUR_ABCDEF":"hello"}

问题解答

1. 这是已知bug还是文档明确的限制?

该行为属于Oracle 23ai中JSON(record)构造器的已知问题,Oracle官方文档未明确声明此截断规则,在Oracle Support的bug数据库中已有相关记录,并非文档规定的限制。

2. 是否有办法禁用该截断行为?

目前没有直接的配置参数或开关可以禁用该截断逻辑,JSON(record)构造器的此处理方式为硬编码实现,无法通过设置关闭。

3. 修复前的最佳解决方法是什么?

推荐以下三种可行方案:

  • 使用SQL的JSON_OBJECT(*)生成:通过SQL查询将记录数据转换为JSON,能完整保留键名,适合可通过SQL访问数据的场景。
  • 手动用JSON_OBJECT_T.put构建键值对:在PL/SQL中逐个将记录成员的完整名称和对应值添加到JSON_OBJECT_T对象中,完全控制键名的完整性,适合需要在PL/SQL内精细处理的场景。
  • 构造后用JSON_TRANSFORM ... RENAME重命名:先生成带截断键的JSON,再通过JSON_TRANSFORM语句将截断的键重命名为完整名称,适合已生成JSON后的修正场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 09:12:41