Oracle Rest 数据服务 POST 使用 JSON

Oracle Rest Data Services POST using JSON

我在 application express(apex) 中使用 oracle rest 数据服务。 我需要知道如何 update/insert 数据库,使用 Json 格式的 http 请求。其实我需要知道的,

请求是来自 REST 客户端的 Json 格式请求,

{
  "items" : [
    {"PROJECTID"       : 1},
    {"PROJ_NAME"       : "rest"},
    {"PROJ_CLIENT"     : "Sam"}
  ],
  "hasMore" : false
}

如何 insert/update 顶点数据库,

begin
insert into projects(PROJECTID,PROJ_NAME,PROJ_CLIENT) 
values (:PROJECTID,:PROJ_CLIENT,:PROJ_NAME);
commit;
end;

我找到了答案,这不容易做到。首先我们需要获取请求的主体。这可以使用 body (:body) 的绑定变量来完成。但是这个主体变量是 blob 数据类型。

blob_body BLOB := :body;

然后把这个转换成CLOB变量,

clob_variable CLOB := convert_to_clob(blob_body);

现在最简单的抽象方法是转换为 'varchar2' 并使用像 PL/JSON 这样的库来提取 json.

中的数据

更新至 apex 5.0。该版本附带了一个很棒的 json 库。
https://docs.oracle.com/cd/E59726_01/doc.50/e39149/apex_json.htm#AEAPI29635

适用于 11g 和 12c SE。我将它用于 ORDS 中非常复杂的 POST 数据。

让我们举个例子(请注意,它是一个非常奇怪的 json 对象,不会那样做):

declare
    /* this would be :BODY */
    l_json   varchar2 (200) := '{
  "items" : [
    {"PROJECTID"       : 1},
    {"PROJ_NAME"       : "rest"},
    {"PROJ_CLIENT"     : "Sam"}
  ],
  "hasMore" : false
}';
begin
    apex_json.parse (l_json); /* use :body on the rest service */
    dbms_output.put_line (apex_json.get_number ('items[%d].PROJECTID', 1));
    dbms_output.put_line (apex_json.get_varchar2 ('items[%d].PROJ_NAME', 2));
    dbms_output.put_line (apex_json.get_varchar2 ('items[%d].PROJ_CLIENT', 3));
    if apex_json.get_boolean ('hasMore') then
        dbms_output.put_line ('True');
    else
        dbms_output.put_line ('False');
    end if;
end;
==>
PL/SQL block executed
1
rest
Sam
False

我觉得json对象大概应该是这样的:

{
    "items": [
        {
            "PROJECTID": 1,
            "PROJ_NAME": "rest",
            "PROJ_CLIENT": "Sam"
        }
    ],
    "hasMore": false
}