【问题标题】:Oracle Rest Data Services POST using JSON使用 JSON 的 Oracle 休息数据服务 POST
【发布时间】:2016-04-13 10:25:51
【问题描述】:

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

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

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

如何在 apex 中插入/更新数据库,

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

【问题讨论】:

  • 什么版本的 APEX?什么版本的数据库?
  • @scottWe 4.2 版
  • 数据库版本可能更重要,因为 12c 中有许多 JSON 特定的 API

标签: oracle oracle-apex


【解决方案1】:

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

blob_body BLOB := :body;

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

clob_variable CLOB := convert_to_clob(blob_body);

现在最简单的抽象方法是转换为 'varchar2' 并使用 PL/JSON 之类的库来提取 json 中的数据。

【讨论】:

    【解决方案2】:

    更新到顶点 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
    }
    

    【讨论】:

    • 这行不通,因为你在这里写的。 :body 必须是 blob 类型,但 apex_json.parse 只接受 clob 或 varchar2,因此您必须先转换为其中任何一个。
    猜你喜欢
    • 1970-01-01
    • 2014-03-09
    • 2018-08-09
    • 2015-02-14
    • 2013-03-27
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多