我有一张桌子,上面有几个条目.有一个具有ID的字段,但它不是唯一的.因此,我希望获得具有特殊ID的所有条目,然后将这些行插入到一个JSON对象中,该对象最终返回给JavaScript.以下是我当前的代码:

DECLARE
    v_json_result_clob CLOB;
BEGIN
    SELECT JSON_ARRAY(
        JSON_OBJECT(
            KEY 'id'           VALUE ID,
            KEY 'blob_data'    VALUE IMAGE RETURNING CLOB
        )
        RETURNING CLOB
    ) INTO v_json_result_clob FROM TEST_TABLE WHERE ID = apex_application.g_x01;

    apex_json.open_object;
    apex_json.write('success', true);
    apex_json.write('result', v_json_result_clob);
    apex_json.close_object;
EXCEPTION
    WHEN OTHERS THEN
        apex_json.open_object;
        apex_json.write('success', false);
        apex_json.write('message', sqlerrm);
        apex_json.close_object;
END;   

Error:

ORA-01422: exact fetch returns more than requested number of rows

我将JSON对象作为CLOB返回,因为它包含一个BLOB-这样我就不会超过varchar长度限制.

我们非常感谢您的帮助.

Best regards,
Filip.

推荐答案

使用JSON_ARRAYAGG将所有行聚合到包含许多对象的单个JSON数组中,而不是返回多行,每行包含一个包含单个对象的JSONarray.

DECLARE
  v_json_result_clob CLOB;
BEGIN
  SELECT JSON_ARRAYAGG(
           JSON_OBJECT(
              KEY 'id'           VALUE ID,
              KEY 'blob_data'    VALUE IMAGE RETURNING CLOB
           )
           RETURNING CLOB
         )
  INTO   v_json_result_clob
  FROM   TEST_TABLE
  WHERE ID = apex_application.g_x01;

  -- ...
END;
/

fiddle

Json相关问答推荐

SWIFT中的网络经理

对面的行/列进行排序时可能出现错误

为什么JQ筛选器不将原始输入打印为$var|.';文档?

在Jolt中将具有嵌套元素的对象数组转换为单独的对象列表

使用JQ合并JSON列表中的对象

使用 jolt 变换展平嵌套 JSON - 非常复杂

Oracle JSON 查询中的动态列列表

从包含 JSON 对象序列的文件中获取第一个 JSON 对象

匹配来自不同数组的值

如何在jolt中使用shift和modify-overwrite-beta

修改 boost::json::object 中的值

如何将 XML 转换为 PsCustomObject 以允许最终导出为 JSON?

使用 Jolt 使用键中的值创建带有硬编码键和值的 JSON 数组

解析 JSON API 响应

Spring MVC 4:application/json内容类型设置不正确

Jackson 动态属性名称

Jsonpath 与 Jackson 或 Gson

在android中读取Json数组

Swift :将 struct 转换为 JSON?

如何将单引号转义成双引号转成单引号