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
相关产品推荐
相关产品推荐

