首页 > 解决方案 > 使用 ORDS Rest API 将 JSON 数据加载/插入到 Apex 表中

问题描述

我需要通过 ORDS Rest API 将数据 [ JSON 格式 ] 加载到 APEX 表中。

所以,我在一个模块中创建了一个 POST 处理程序,下面是该处理程序的 PL/SQL 代码

PL/SQL

begin
insert into PEEP(USER_ID,NAME,AGE,PROFESSION,LOCATION) values (:val1,:val2,:val3,:val4,:val5);
end;

卷曲命令:

curl -s -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{"val1":"121","val2":"Rachel","val3":"37","val4":"Psychologist","val5":"Melbourne"}' https://xxxxx/ords/apex/peep/uploadinfo

上述方法的问题是它只插入一个带有单个 API 调用的行,如果我用 -d 给出多行,那么它只插入第一行并忽略第二行/输入

例子

{"user_id" : 111,"name":"Sam","age":29,"profession":"Saxophonist","location":"Sydney"},{"user_id" : 121,"name":"瑞秋","年龄":37,"职业":"心理学家","位置":"墨尔本"}

我的要求是使用 curl 命令将 JSON 文件作为输入,或者在 curl 命令中使用 -d 提供多个输入

有人可以帮我吗?

标签: oracleoracle-apexoracle-apex-5

解决方案


您的 pl/sql 正文只接受一行,因此之后的任何内容都将被忽略。您需要使用 :body 引用整个有效负载,并使用 oracle 中的 JSON_TABLE 语法对其进行循环。杰夫史密斯在这里写了一篇很好的文章:www.thatjeffsmith.com。他的代码中的示例并不完全相同,他使用的是单个复杂结构。在您的情况下,您需要遍历数据。

您必须使用 json_table 循环遍历元素并逐行处理元素。

  • 从使用硬编码 json 在 sqldeveloper 中测试您的代码开始,类似于下面的示例。
  • 一旦你的 sql 语句在 sqldeveloper 中工作,将它合并到你的 rest 处理程序的 pl/sql 主体中。将其放入 for 循环并尝试插入行。测试/调试
  • 一旦它工作,用“:body”替换硬编码的json。测试/调试

如何将 json 转换为行的示例(使用 emp 表中的记录,为了测试,我只取了 2 列,但你明白了)

SELECT 
  empno,
  ename
FROM 
  JSON_TABLE('{"items":
[
{"empno":7839,"ename":"KING","job":"PRESIDENT","hiredate":"17-NOV-1981","sal":5000,"deptno":10}
,{"empno":7698,"ename":"BLAKE","job":"MANAGER","mgr":7839,"hiredate":"01-MAY-1981","sal":2850,"deptno":30}
]
}' , '$.items[*]'
           COLUMNS (
             empno  NUMBER   PATH '$.empno',
             ename  VARCHAR2(50)   PATH '$.ename'
             ));

推荐阅读