Oracle 19c如何生成键单次列出、值集合紧随的JSON格式?
Oracle 19c 实现指定格式的JSON输出
可以实现你需要的JSON格式,以下是具体的SQL实现方法:
方法一:固定字段直接查询
SELECT JSON_OBJECT( 'keys' VALUE (SELECT JSON_ARRAYAGG(column_name ORDER BY column_id) FROM user_tab_columns WHERE table_name = 'TBL1'), 'values' VALUE JSON_ARRAYAGG(JSON_ARRAY(val1, val2, val3) RETURNING VARCHAR2) ) AS JSON_VAR FROM tbl1;
代码说明
- 生成keys数组:通过
user_tab_columns系统视图读取表TBL1的列名,按column_id(列定义顺序)排序后用JSON_ARRAYAGG聚合成数组,保证列名顺序与表结构一致。 - 生成values二维数组:对每行数据,用
JSON_ARRAY(val1, val2, val3)将当前行字段转为数组,再通过JSON_ARRAYAGG把所有行的数组聚合为二维数组。 - 组合最终JSON:用
JSON_OBJECT将keys和values两个部分拼接成目标结构的JSON对象。
执行后将得到期望输出:
{"keys" : ["VAL1", "VAL2", "VAL3"], "values" : [["1", "2", "3"],["a", "b", "c"],["1","b","3"]]}
方法二:动态SQL通用版(适配任意列数)
如果表的字段较多,不想手动列写字段名,可以用动态SQL自动适配表结构:
DECLARE v_cols VARCHAR2(1000); v_sql VARCHAR2(2000); BEGIN -- 获取表的所有列名,按定义顺序拼接 SELECT LISTAGG(column_name, ',') WITHIN GROUP (ORDER BY column_id) INTO v_cols FROM user_tab_columns WHERE table_name = 'TBL1'; -- 构造动态SQL语句 v_sql := 'SELECT JSON_OBJECT( ''keys'' VALUE (SELECT JSON_ARRAYAGG(column_name ORDER BY column_id) FROM user_tab_columns WHERE table_name = ''TBL1''), ''values'' VALUE JSON_ARRAYAGG(JSON_ARRAY(' || v_cols || ') RETURNING VARCHAR2) ) AS JSON_VAR FROM tbl1'; -- 执行并输出结果 EXECUTE IMMEDIATE v_sql; END; /
这个版本无需手动指定字段,会自动读取表的所有列并生成对应格式的JSON。
内容的提问来源于stack exchange,提问作者DBox
相关产品推荐
相关产品推荐

