oracle - 使用 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 提供多个输入
有人可以帮我吗?
解决方案
您的 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'
));
推荐阅读
- trustpilot - Trustpilot API 查询给定日期范围的评论
- android - 如何在颤振中创建自定义形状小部件
- angular - ngrx 效果说明:@Effect
- php - 我创建了一个聊天应用程序,用于自动获取消息,我使用 setinterval 函数和 ajax 请求来获取数据
- javascript - 重新加载后如何更改同一刀片文件中的表单标签信息
- python - 使用python selenium提取页面源的最快方法是什么
- entity-framework - 使用聚合函数应用 GroupBy 扩展方法的正确方法
- google-bigquery - bigquery 不加载 JSON
- mysql - Sequelize raw select 查询无法访问表
- jestjs - 告诉 jest 处理 Vite 的 "?raw" 语法