如何将 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.
请注意,该字符串的格式不正确 - 不应该如此。那是收到后的最后一步,而不是从“发送”端做的事情。
我有一个使用 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.
请注意,该字符串的格式不正确 - 不应该如此。那是收到后的最后一步,而不是从“发送”端做的事情。