我需要以 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 来完成:
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]"}]}