JSON_OBJECT_T 错误 - 提供的 JavaScript 对象表示法 (JSON) 运算符生成的结果超出最大长度

问题描述 投票:0回答:1

我试图使用下面的 PLSQL 从表中获取数据,但在我的例子中,我有大约 30 条记录,当我获取时,出现以下错误。请帮助我,因为我是 PLSQL 新手。 我只需要 JSON_OBJECT_T 格式的响应,但我想避免此错误消息。请帮忙

  1. 00000 - “输出值太大(最大值:%s)” *原因:提供的 JavaScript 对象表示法 (JSON) 运算符生成了 结果超出 RETURN 中指定的最大长度 条款。 *操作:增加 RETURNING 子句中数据类型的最大大小 或者在 RETURNING 子句中使用 CLOB 或 BLOB。
DECLARE
  l_json_object JSON_OBJECT_T;
  l_json CLOB;
BEGIN
   SELECT
      JSON_OBJECT(
         KEY 'employees' VALUE 
            JSON_ARRAYAGG(
               JSON_OBJECT(KEY 'empno' VALUE id
                           ,KEY 'ename' VALUE name
                           ,KEY 'job' VALUE email_id)
               ORDER BY id) 
            RETURNING CLOB)
     INTO l_json
     FROM employee_tbl;
   -- now convert clob to JSON_OBJECT_T
   l_json_object := JSON_OBJECT_T.PARSE(l_json);
   -- or...this works too
   -- l_json_object := JSON_OBJECT_T(l_json);

   -- check if value is correct
   dbms_output.put_line(l_json_object.to_clob);
END;
/

预期输出:

{"employees":[{"empno":1065,"ename":"Abu","job":"[email protected]"},{"empno":1066,"ename":"Umar","job":"[email protected]"}]}

表格示例:

CREATE TABLE employee_tbl (id, name, email_id) AS
  SELECT 1065, 'Abu',  '[email protected]' FROM DUAL UNION ALL
  SELECT 1066, 'Umar', '[email protected]' FROM DUAL
sql plsql oracle-sqldeveloper plsqldeveloper
1个回答
0
投票

您需要数组聚合来生成 CLOB,以及最终的外部 JSON 对象;所以

               ORDER BY id)
            RETURNING CLOB)
     INTO l_json

成为

               ORDER BY id
               RETURNING CLOB) 
            RETURNING CLOB)
     INTO l_json

进行整个查询:

   SELECT
      JSON_OBJECT(
         KEY 'employees' VALUE 
            JSON_ARRAYAGG(
               JSON_OBJECT(KEY 'empno' VALUE id
                           ,KEY 'ename' VALUE name
                           ,KEY 'job' VALUE email_id)
               ORDER BY id
               RETURNING CLOB) 
            RETURNING CLOB)
     INTO l_json
     FROM employee_tbl;

fiddle 使用扩展/重复数据来重现初始错误,并修改输出,以便显示 CLOB 结果的一部分。

© www.soinside.com 2019 - 2024. All rights reserved.