如何使用 ORDS Rest API 将 JSON 数据加载到 Oracle 中?
How can I load JSON data into Oracle using a ORDS Rest API?
我正在尝试学习如何将 JSON 对象加载到 ORDS table 中的教程。我使用标准卷曲一次处理 1 条记录,但如果我可以提供一个大文件,然后通过 JSON_TABLE.
在我的 REST 处理程序中读取该文件,那就太好了
我要编译的代码:
create or replace PROCEDURE create_employee (
p_empno IN emp.empno%TYPE,
p_ename IN emp.ename%TYPE,
p_job IN emp.job%TYPE,
p_mgr IN emp.mgr%TYPE,
p_hiredate IN VARCHAR2,
p_sal IN emp.sal%TYPE,
p_comm IN emp.comm%TYPE,
p_deptno IN emp.deptno%TYPE
)
AS
BEGIN
INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
SELECT
empno, ename, ejob, mgr, hiredate, sal,comm, deptno
FROM
JSON_TABLE(:body_text, '$'
COLUMNS (
empno NUMBER PATH '$.empno',
ename VARCHAR2(50) PATH '$.ename',
ejob VARCHAR2(50) PATH '$.ejob',
mgr VARCHAR2(50) PATH '$.mgr',
hiredate VARCHAR2(50) PATH '$.hiredate',
sal VARCHAR2(50) PATH '$.sal',
comm VARCHAR2(50) PATH '$.comm',
deptno VARCHAR2(50) PATH '$.deptno'
));
EXCEPTION
WHEN OTHERS THEN
HTP.print(SQLERRM);
COMMIT;
END;
如果我将 :body_text、'$' 替换为实际的 JSON,它会很好用并且完全按照我的需要显示多行。
当前遇到以下错误:Error(19,14): PLS-00049: bad bind variable 'BODY_TEXT'
加载文件示例。
[
{"empno":7839,"ename":"KING","job":"PRESIDENT","mgr":7839,"hiredate":"17-NOV-1981","sal":5000,"comm": null,"deptno":10}
,{"empno":7698,"ename":"BLAKE","job":"MANAGER","mgr":7839,"hiredate":"01-MAY-1981","sal":2850,"comm": null,"deptno":30}
]
在该博客 post 中,Jeff 将该代码放入 post 处理程序的源代码中,而您将其放入 pl/sql 存储过程中。这不会编译,因为绑定变量 :body_text 在该过程的范围内不存在。
如果将以下代码放在 POST 处理程序的源代码中(不使用存储过程),它应该可以工作:
BEGIN
INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
SELECT
empno, ename, ejob, mgr, hiredate, sal,comm, deptno
FROM
JSON_TABLE(:body_text, '$'
COLUMNS (
empno NUMBER PATH '$.empno',
ename VARCHAR2(50) PATH '$.ename',
ejob VARCHAR2(50) PATH '$.ejob',
mgr VARCHAR2(50) PATH '$.mgr',
hiredate VARCHAR2(50) PATH '$.hiredate',
sal VARCHAR2(50) PATH '$.sal',
comm VARCHAR2(50) PATH '$.comm',
deptno VARCHAR2(50) PATH '$.deptno'
));
EXCEPTION
WHEN OTHERS THEN
HTP.print(SQLERRM);
COMMIT;
END;
我相信此处显示了您正在寻找的示例:https://oracle-base.com/articles/misc/oracle-rest-data-services-ords-restful-web-services-handling-complex-json-payloads。它展示了使用存储过程处理 json 负载的不同可能性。如您所见,那篇文章中的存储过程都是用一个 blob 参数创建的,该参数将保存 json 对象。请注意,如果您使用的是 blob,则绑定变量为 :body
,对于 clob 为 :body_text
我正在尝试学习如何将 JSON 对象加载到 ORDS table 中的教程。我使用标准卷曲一次处理 1 条记录,但如果我可以提供一个大文件,然后通过 JSON_TABLE.
在我的 REST 处理程序中读取该文件,那就太好了我要编译的代码:
create or replace PROCEDURE create_employee (
p_empno IN emp.empno%TYPE,
p_ename IN emp.ename%TYPE,
p_job IN emp.job%TYPE,
p_mgr IN emp.mgr%TYPE,
p_hiredate IN VARCHAR2,
p_sal IN emp.sal%TYPE,
p_comm IN emp.comm%TYPE,
p_deptno IN emp.deptno%TYPE
)
AS
BEGIN
INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
SELECT
empno, ename, ejob, mgr, hiredate, sal,comm, deptno
FROM
JSON_TABLE(:body_text, '$'
COLUMNS (
empno NUMBER PATH '$.empno',
ename VARCHAR2(50) PATH '$.ename',
ejob VARCHAR2(50) PATH '$.ejob',
mgr VARCHAR2(50) PATH '$.mgr',
hiredate VARCHAR2(50) PATH '$.hiredate',
sal VARCHAR2(50) PATH '$.sal',
comm VARCHAR2(50) PATH '$.comm',
deptno VARCHAR2(50) PATH '$.deptno'
));
EXCEPTION
WHEN OTHERS THEN
HTP.print(SQLERRM);
COMMIT;
END;
如果我将 :body_text、'$' 替换为实际的 JSON,它会很好用并且完全按照我的需要显示多行。
当前遇到以下错误:Error(19,14): PLS-00049: bad bind variable 'BODY_TEXT'
加载文件示例。
[
{"empno":7839,"ename":"KING","job":"PRESIDENT","mgr":7839,"hiredate":"17-NOV-1981","sal":5000,"comm": null,"deptno":10}
,{"empno":7698,"ename":"BLAKE","job":"MANAGER","mgr":7839,"hiredate":"01-MAY-1981","sal":2850,"comm": null,"deptno":30}
]
在该博客 post 中,Jeff 将该代码放入 post 处理程序的源代码中,而您将其放入 pl/sql 存储过程中。这不会编译,因为绑定变量 :body_text 在该过程的范围内不存在。
如果将以下代码放在 POST 处理程序的源代码中(不使用存储过程),它应该可以工作:
BEGIN
INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
SELECT
empno, ename, ejob, mgr, hiredate, sal,comm, deptno
FROM
JSON_TABLE(:body_text, '$'
COLUMNS (
empno NUMBER PATH '$.empno',
ename VARCHAR2(50) PATH '$.ename',
ejob VARCHAR2(50) PATH '$.ejob',
mgr VARCHAR2(50) PATH '$.mgr',
hiredate VARCHAR2(50) PATH '$.hiredate',
sal VARCHAR2(50) PATH '$.sal',
comm VARCHAR2(50) PATH '$.comm',
deptno VARCHAR2(50) PATH '$.deptno'
));
EXCEPTION
WHEN OTHERS THEN
HTP.print(SQLERRM);
COMMIT;
END;
我相信此处显示了您正在寻找的示例:https://oracle-base.com/articles/misc/oracle-rest-data-services-ords-restful-web-services-handling-complex-json-payloads。它展示了使用存储过程处理 json 负载的不同可能性。如您所见,那篇文章中的存储过程都是用一个 blob 参数创建的,该参数将保存 json 对象。请注意,如果您使用的是 blob,则绑定变量为 :body
,对于 clob 为 :body_text