在 PL/SQL 中解析 JSON 数组

Parse JSON array in PL/SQL

PL/SQL这里是新手

我正在使用 Oracle APEX 作为我的 REST 服务器,我正在从我的应用程序向 REST 服务器发送一个 JSON 数组 (items)。 JSON 包含日志,其中可能有 100 条。我可以一个一个地成功发送它们,但效率不高,所以我希望能够发送一个包含日志的 JSON 数组。

这是一些测试JSON:

{
    "items": [{
        "source": "00000999",
        "message": "test1"
    }, {
        "source": "00000999",
        "message": "test2"
    }, {
        "source": "00000999",
        "message": "test3"
    }, {
        "source": "00000999",
        "message": "test4"
    }]
}

一旦我可以解析那个 JSON 数组,我就会将它们作为单独的行添加到数据库中。

这是我目前拥有的:

set serveroutput on;
declare
items varchar2(2000):= '{"items":[{"source": "00000999","message": "test1"}, {"source": "00000999","message": "test2"}, {"source": "00000999","message": "test3"}, {"source": "00000999","message": "test4"}]}';
v_source varchar2(100);
   v_message varchar2(2000);
   v_json_list json_list;
   v_json_list2 json_list;
begin
   v_json_list := json_list(items);
   v_json_list2 := json_ext.get_string(json(v_json_list.GET(0)),'items');
   for i in 1..v_json_list2.count
      loop
         begin 
            v_source := json_ext.get_string(json(v_json_list2.GET(i)),'source');
            v_message := json_ext.get_string(json(v_json_list2.GET(i)),'message');
            ca_log_pak.log_info(v_source, v_message);
         end;
      end loop;
   commit;

   dbms_output.put_line('Y');


exception 
   when others then

      dbms_output.put_line(SQLERRM); 
end;

这是在 v_json_list := json_list(items);

上抛出一个错误 expression is of the wrong type

谁能告诉我如何正确解析 items 数组?

谢谢

我认为你的 JSON 字符串应该是这样的:

[{"source": "00000999","message": "test1"}, {"source": "00000999","message": "test2"}, {"source": "00000999","message": "test3"}, {"source": "00000999","message": "test4"}]

试试这个:

DECLARE
  items VARCHAR2(2000):= '{"items":[{"source": "00000999","message": "test1"}, {"source": "00000999","message": "test2"}, {"source": "00000999","message": "test3"}, {"source": "00000999","message": "test4"}]}';
  my_json json_list   := json_list(LTRIM(RTRIM(items,'}'), '{"items":'));
  listElement json_value;
  jsonObj json;
BEGIN
  FOR i IN 1..my_json.count
  LOOP
    listElement := my_json.get(i);
    jsonObj     := json(listElement);
    dbms_output.put_line(jsonObj.json_data(1).mapname);
    dbms_output.put_line(jsonObj.json_data(1).str);
  END LOOP;
END;

你试过在 5.0 中使用 apex_json 包吗 通过使用它,您可以将数据转换为临时 xmltable 并使用 INSERT INTO SELECT 概念插入到永久 table 中。 你可以在

看到 apexjson 和 xml table 的样本