如何将 select 多行转换为 JSON 字符串变量?

How to select multiple rows into a JSON string variable?

我有一个使用 Oracle 资源模板创建的 REST API,我希望能够使用 PL/SQL 块执行 SELECT 查询。我可以 return 数据作为字符串,所以我认为一种解决方案是将查询结果存储为 JSON 字符串和 return 它。

有了这个问题的答案,这个问题可能就解决了How can one return data from a Pl/SQL block in an Oracle REST API resource template?

我尝试做的事的例子;此代码无效:

declare
  items JSON_OBJECT_T;
begin
    select JSON_OBJECT(*) BULK COLLECT into items from my_table;
    :items := items;  -- :items will be returned by the API.
    -- I believe I would have to serialize the JSON_OBJECT_T to string somehow.
end;

:items 必须分配一个有效的 JSON 字符串,它必须是一个对象数组,其中每个对象是一行。

我必须从 API 得到答案的示例:

"items": [
    {
      "name": "John",
      "age": "21",
      "sex": "m"
    },
    {
      "name": "Mike",
      "age": "22",
      "sex": "m"
    },
    {
      "name": "Susan",
      "age": "30",
      "sex": "f"
    }
]

以下是您可以在 Oracle 12.2 中执行的操作。在 Oracle 19 中可能更简单一些,使用 json_object(*).

使用 SCOTT 架构中的标准 DEPT table 进行说明:

declare
  items  json_object_t;
  result clob;
begin
  select json_object(
           key   'items'
           value json_arrayagg(
                   json_object(
                     key 'deptno' value deptno,
                     key 'dname'  value dname,
                     key 'loc'    value loc
                   )
                 ) format json
         ) 
  into   result
  from   scott.dept;
  items := json_object_t(result);
-- Check what is stored in items
  dbms_output.put_line('items.stringify = ' || chr(10) || items.stringify);
end;
/

我调用了 stringify 方法来显示 json_object_t 对象的内容。 ApEx 可能更喜欢 json_object_t 数据类型 - 如果您只需要一个字符串,则不需要构造该对象,因为 result 已经是您需要的字符串。

结果如下所示:

items.stringify = 
{"items":[{"deptno":10,"dname":"ACCOUNTING","loc":"NEW YORK"},{"deptno":20,"dname":"RESEARCH","loc":"DALLAS"},{"deptno":30,"dname":"SALES","loc":"CHICAGO"},{"deptno":40,"dname":"OPERATIONS","loc":"BOSTON"}]}


PL/SQL procedure successfully completed.

请注意,该字符串的格式不正确 - 不应该如此。那是收到后的最后一步,而不是从“发送”端做的事情。