当前位置: 首页 > 面试题库 >

使用PL / SQL将JSON解析为Oracle表

鄢雅畅
2023-03-14
问题内容

我创建了以下脚本,以便从Oracle SQL Developer从Mobile App DB(基于MongoDB)读取数据:

DECLARE
  l_param_list     VARCHAR2(512);

  l_http_request   UTL_HTTP.req;
  l_http_response  UTL_HTTP.resp;

  l_response_text  VARCHAR2(32767);
BEGIN

  -- service's input parameters

  -- preparing Request...
  l_http_request := UTL_HTTP.begin_request ('https://api.appery.io/rest/1/db/collections/Photos?where=%7B%22Oracle_Flag%22%3A%22Y%22%7D'
                                          , 'GET'
                                          , 'HTTP/1.1');

  -- ...set header's attributes
  UTL_HTTP.set_header(l_http_request, 'X-Appery-Database-Id', '53f2dac5e4b02cca64021dbe');
  --UTL_HTTP.set_header(l_http_request, 'Content-Length', LENGTH(l_param_list));

  -- ...set input parameters
 -- UTL_HTTP.write_text(l_http_request, l_param_list);

  -- get Response and obtain received value
  l_http_response := UTL_HTTP.get_response(l_http_request);

  UTL_HTTP.read_text(l_http_response, l_response_text);

  DBMS_OUTPUT.put_line(l_response_text);
  insert into appery values(l_response_text);
  -- finalizing
  UTL_HTTP.end_response(l_http_response);


EXCEPTION
  WHEN UTL_HTTP.end_of_body 
    THEN UTL_HTTP.end_response(l_http_response);  
END;
/

响应 (l_response_text) 是类似JSON的字符串。例如:

[{"Postcode":"47100","OutletCode":"128039251","MobileNumber":"0123071303","_createdAt":"2014-11-10 06:12:49.837","_updatedAt":"2014-11-10 06:12:49.837"}, {"Postcode":"32100","OutletCode":"118034251", ..... ]

该代码可以正常工作,并将响应插入一个名为 appery的列表中 。但是,我需要解析此响应,以便每个数组进入名为 appery_test
的表中的特定列。表 appery_test 的列数与JSON对数相同,并且顺序相同。

我进行了搜索,发现有关将Oracle表解析为JSON的大多数结果,而并非相反。不过,我发现此链接与我的问题有点相似。但是,答案中建议的库没有有关如何使用它通过PL / SQL将JSON插入常规表的任何示例。

注意:
我使用的是11g,而不是12c。因此内置功能对我不可用。


问题答案:

我使用PL /JSON库。具体来说,JSON_EXT包用于解析它。

以下受Oracle Community Answer启发的脚本对我有用

DECLARE
  l_param_list     VARCHAR2(512);

  l_http_request   UTL_HTTP.req;
  l_http_response  UTL_HTTP.resp;

  l_response_text  VARCHAR2(32767);

l_list json_list;
A_id           VARCHAR2(200);
UserId         VARCHAR2(100);
UserName       VARCHAR2(100);
OutletCode     VARCHAR2(100);
OutletName     VARCHAR2(100);
MobileNumber   VARCHAR2(100);
PhoneNumber    VARCHAR2(100);
Address        VARCHAR2(100);
City           VARCHAR2(100);
State          VARCHAR2(100);
Postcode       VARCHAR2(100);
Email          VARCHAR2(100);
UpdateCount    VARCHAR2(100);
loginCount     VARCHAR2(100);
ReferencePhoto VARCHAR2(100);
Updates        VARCHAR2(100);
AccountLocked  VARCHAR2(100);
Oracle_Flag    VARCHAR2(100);
acl            VARCHAR2(100);


BEGIN

  -- service's input parameters

  -- preparing Request...
  l_http_request := UTL_HTTP.begin_request('https://api.appery.io/rest/1/db/collections/Outlet_Details?where=%7B%22Oracle_Flag%22%3A%22Y%22%7D'
                                          , 'GET'
                                          , 'HTTP/1.1');

  -- ...set header's attributes
  UTL_HTTP.set_header(l_http_request, 'X-Appery-Database-Id', '53f2dac5e4b02cca64021dbe');
  --UTL_HTTP.set_header(l_http_request, 'Content-Length', LENGTH(l_param_list));

  -- ...set input parameters
 -- UTL_HTTP.write_text(l_http_request, l_param_list);

  -- get Response and obtain received value
  l_http_response := UTL_HTTP.get_response(l_http_request);

  UTL_HTTP.read_text(l_http_response, l_response_text);

  DBMS_OUTPUT.put_line(l_response_text);
  l_list := json_list(l_response_text);

FOR i IN 1..l_list.count
LOOP
  A_id           := json_ext.get_string(json(l_list.get(i)),'_id');
  UserId         := json_ext.get_string(json(l_list.get(i)),'UserId');
  UserName       := json_ext.get_string(json(l_list.get(i)),'UserName');
  OutletCode     := json_ext.get_string(json(l_list.get(i)),'OutletCode');
  OutletName     := json_ext.get_string(json(l_list.get(i)),'OutletName');
  MobileNumber   := json_ext.get_string(json(l_list.get(i)),'MobileNumber');
  PhoneNumber    := json_ext.get_string(json(l_list.get(i)),'PhoneNumber');
  Address        := json_ext.get_string(json(l_list.get(i)),'Address');
  City           := json_ext.get_string(json(l_list.get(i)),'City');
  State          := json_ext.get_string(json(l_list.get(i)),'State');
  Postcode       := json_ext.get_string(json(l_list.get(i)),'Postcode');
  Email          := json_ext.get_string(json(l_list.get(i)),'Email');
  UpdateCount    := json_ext.get_string(json(l_list.get(i)),'UpdateCount');
  loginCount     := json_ext.get_string(json(l_list.get(i)),'loginCount');
  ReferencePhoto := json_ext.get_string(json(l_list.get(i)),'ReferencePhoto');
  Updates        := json_ext.get_string(json(l_list.get(i)),'Updates');
  AccountLocked  := json_ext.get_string(json(l_list.get(i)),'AccountLocked');
  Oracle_Flag    := json_ext.get_string(json(l_list.get(i)),'Oracle_Flag');
  acl            := json_ext.get_string(json(l_list.get(i)),'acl');


insert .....

请注意, json_ext.get_string
仅限制最大限制为32767的VARCHAR2。为了对更大的json_list和json_values(>32KB)使用相同的包,请在此处检查。

如果您拥有APEX5.0及更高版本,则可以通过APEX_JSON软件包获得更好的选择和更好的性能。



 类似资料:
  • 本文向大家介绍Oracle PL/SQL异常处理方法解析,包括了Oracle PL/SQL异常处理方法解析的使用技巧和注意事项,需要的朋友参考一下 Oracle数据库中的异常:没有异常的转移,因为没有受检异常和非受检异常得区分。 1.异常的产生: 2.异常的处理: declare   --变量定义,初始化赋值。 begin   --变量的赋值,函数调用,if,while等。 exception  

  • 问题内容: 我的样子如下: 现在,每个元素具有相同的结构(假设一个POJO称为MessageDefault.java)。那么我怎么能把所有东西都当作一个??呢? 我正在使用gson进行解析。我也不能更改JSON响应。 编辑:: MessageDefault.java 它只是一切的结构。但是在JSON中,的每个子项都有不同的名称,例如POJO MessageDefault.java中所反映的名称。但

  • 我试图将一个对象转换为json格式,但它不起作用(我得到一个奇怪的堆栈溢出异常)。它从对象到XML都能完美地工作。我有一个简单的实体类User和另一个具有多个关系的类。 相关类 我将@XmlTransient注释放在我想要忽略的getter上。 下面是我的rest服务中的一个方法,它从用户的昵称返回用户 因此,它使用@products({“application/xml”})而不是@product

  • 我使用下面的脚本从MongoDB中获取JSON文件,对其进行解析,然后将其插入到Oracle表中。 > 该脚本可以正确地将所有值插入到Oracle表中。这包括值Photo,它是一个base64 formate的图像,它比32KB大得多。 表Appery_Photos中的列Photo是CLOB类型,而列DecodedPhoto是BLOB类型。 问题在于行,我用它将CLOB解码为BLOB。函数base

  • 本文向大家介绍Oracle PL/SQL中异常高级特性示例解析,包括了Oracle PL/SQL中异常高级特性示例解析的使用技巧和注意事项,需要的朋友参考一下 PL/SQL(Procedural Language/SQL,过程语言/SQL)是结合了Oracel过程语言和结构化查询语言(SQL)的一种扩展语言。 优点: (1)PL/SQL具有编程语言的特点,它能把一组SQL语句放到一个模块中,使其更

  • 问题内容: 我需要在pl / sql中解析数​​学方程式/函数。 oracle pl / sql中提供了哪些数学运算/函数可以帮助我解析这样的数学函数: 我想要一个函数来解析此语句并找出的值。 有什么帮助吗?谢谢。 问题答案: the,Oracle数据库不是数学工具。它具有许多算术和统计功能,但不具有能​​够解释方程式的内置功能。对不起。 碰巧的是,Marc(AKA Odie_63)最近发布了他用