如何缩短 PLSQL 中的 fetch into 子句以返回 JSON_OBJECT_T 类型的数据

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

我需要以 JSON_OBJECT_T 返回响应,其中包含表中的记录数组。但我有 50 列要获取,这个 fetch into 子句让我写入所有 50 列名称,有没有办法直接将 select 查询的响应写入 JSON_ARRAY_T 和 JSON_OBJECT_T 并返回。请帮助我,因为我是 PLSQL 新手

-- Declare a JSON object variable and a cursor for the query
DECLARE
  l_json_array JSON_ARRAY_T := JSON_ARRAY_T();
  l_json_object JSON_OBJECT_T;
  p_json_object JSON_OBJECT_T := JSON_OBJECT_T();
  l_cursor SYS_REFCURSOR;
  l_id NUMBER;
  l_name VARCHAR2(100);
  l_email_id VARCHAR2(100);
BEGIN
  OPEN l_cursor FOR
    SELECT id, name, email_id
    FROM EMPLOYEE_TBL;
  LOOP
    FETCH l_cursor INTO l_id, l_name, l_email_id;
    EXIT WHEN l_cursor%NOTFOUND;
    l_json_object := JSON_OBJECT_T();
    l_json_object.put('empno', l_id);
    l_json_object.put('ename', l_name);
    l_json_object.put('job', l_email_id);
    l_json_array.append(l_json_object);
  END LOOP;
  CLOSE l_cursor;
  p_json_object.put('employees', l_json_array);
  DBMS_OUTPUT.PUT_LINE(p_json_object.stringify);
END;

我需要的响应如下,但我想改进上面的代码,这样我就不必将所有列名称声明为 PLSQL 中的变量,如 l_id、l_name、l_email_id

{"employees":[{"empno":1065,"ename":"Abu","job":"[email protected]"},{"empno":1066,"ename":"Umar","job":"[email protected]"}]}
sql oracle plsql
1个回答
0
投票

您可以完全用 SQL 来完成:

SELECT JSON_OBJECT(
         KEY 'employees' VALUE JSON_ARRAYAGG(
           JSON_OBJECT(
             KEY 'empno' VALUE id,
             KEY 'ename' VALUE name,
             KEY 'job'   VALUE email_id
           )
           RETURNING CLOB
         )
         RETURNING CLOB
       ) AS json
FROM   employee_tbl;

对于样本数据:

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

输出:

JSON
{"employees":[{"empno":1065,"ename":"Abu","job":"[电子邮件受保护]"},{"empno":1066,"ename":"Umar" ,"工作":"[电子邮件受保护]"}]}

如果您确实想使用 PL/SQL 那么:

DECLARE
  p_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
           )
           RETURNING CLOB
         ) AS json
  INTO   p_json
  FROM   employee_tbl;
  DBMS_OUTPUT.PUT_LINE(p_json);
END;
/

哪个输出:

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

小提琴

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