【问题标题】:Oracle - JSON_OBJECT - ORA-40478: output value too large (maximum: 4000)Oracle - JSON_OBJECT - ORA-40478:输出值太大(最大值:4000)
【发布时间】:2020-01-30 14:13:52
【问题描述】:

我正在使用 Oracle 18c 数据库。

对于我的一个查询,我正在尝试从 3 级表生成 JSON。

pages_tbl 
    page_regions_tbl 
        region_items_tbl 

为此,我准备了以下查询。但它给了我错误ORA-40478: output value too large (maximum: 4000)

SELECT 
  JSON_ARRAYAGG(
    JSON_OBJECT(
      'page' VALUE p.name, 
      'regions' VALUE(
        SELECT 
          JSON_ARRAYAGG(
            JSON_OBJECT(
              'region' VALUE r.name, 
              'items' VALUE(
                SELECT 
                  JSON_ARRAYAGG(
                    JSON_OBJECT(
                      'item_name' VALUE i.item_name, 'item_value' VALUE i.item_value
                    ) RETURNING CLOB
                  ) 
                FROM region_items_tbl i
               WHERE i.region_id = r.region_id
                 AND i.enabled = 1
              )
            ) RETURNING CLOB
          ) 
        FROM page_regions_tbl r 
       WHERE r.page_id = p.page_id
         AND r.enabled = 1
      ) 
    ) RETURNING CLOB
  ) 
 FROM pages_tbl p 
WHERE p.category_id = 10150
  AND p.enabled = 1

我已经写了RETURNING CLOB,所以我期待顺利的结果,但得到了错误。谁能指出我做错了什么或如何解决此查询

【问题讨论】:

  • 你在哪个版本的 oracle 上运行?
  • @OldProgrammer Oracle 18.3
  • 我在 oracle 知识库 Doc ID 2354511.1 上找到了一个建议。您可以访问 oracle 支持吗?
  • @OldProgrammer 我无权访问支持帐户。
  • 好的。我会发布作为答案。试试看,如果不起作用,我可以删除答案。

标签: sql oracle


【解决方案1】:

在所有 JSON_OBJECT 的右括号之前添加 RETURNING CLOB

https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/JSON_OBJECT.html

JSON_returning_clause

使用此子句指定返回值的类型。之一:

VARCHAR2 将大小指定为字节数或字符数。默认值为字节。如果省略此子句,或指定子句而不指定大小值,则 JSON_ARRAY 返回类型为 VARCHAR2(4000) 的字符串。有关详细信息,请参阅 VARCHAR2 数据类型。请注意,在 SQL 的其他地方指定 VARCHAR2 数据类型时,您需要指定大小。但是,在 JSON_returning_clause 中,您可以省略大小。

CLOB 返回一个包含单字节或多字节字符的字符大对象。

【讨论】:

  • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
【解决方案2】:

我遇到了同样的问题和同样的结果(仍然失败,即使将 RETURNING CLOB 添加到每个 JSON_OBJECT),但是我发现您还需要将 RETURNING CLOB 添加到您的 JSON_ARRAYAGG 函数(但不是您的 JSON_ARRAY 函数,如果你有的话)。这为我解决了这个问题,它将返回的数据显示为“(CLOB)”,但当您单击它时会扩展为真实数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多