如何使用 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 处理程序中读取该文件,那就太好了

教程link:https://www.thatjeffsmith.com/archive/2019/03/using-the-database-to-manipulate-json-from-your-post-body-requests-in-ords/

我要编译的代码:

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