2016-08-26 65 views
0

我正在从Web服务获取JSON响应。我想将该JSON数据提取到PL/SQL变量中。你能解释我该如何达到目标?将CLOB JSON数据提取到Oracle中的局部变量中

在此先感谢。

+1

哪个Oracle的版本? 12c具有本机JSON处理。在早期版本中,您可以尝试[PL/JSON](https://github.com/pljson/pljson/)。 –

+0

我正在使用12c版本。由于要求,不能使用PL/JSON或APEX。我如何在没有任何库的情况下从PL/SQL中实现? – Rohit

+0

如果您在12c上,请使用内置的[JSON处理](https://docs.oracle.com/database/121/ADXDB/json.htm#ADXDB6246),因为Hawk已经在他们的答案中链接了。 –

回答

1

正如Alex Poole在评论中提到的那样,如果您使用的是Oracle 12c,那么您将拥有支持创建和读取JSON的丰富功能。即使您在早期版本上运行,并且安装了Oracle APEX 5.0或更高版本(如果没有,您可以安装它,它是免费的),那么您可以利用丰富的APEX_JSON包以及它提供的类似功能。

但是,如果这两个选项都不适合您,那么您可以使用PL/SQL包套件。下面是一个简单的片段,向您展示如何在安装后使用它们。

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; --json array type 
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 
    -- preparing Request... 
    l_http_request := UTL_HTTP.begin_request('/*your GET service URL here*/' 
             , 'GET' 
             , 'HTTP/1.1'); 

    -- ...set header's attributes 
    UTL_HTTP.set_header(l_http_request, '/*header name*/', '/*header value*/'); 

    -- ...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); -- get json response here 

--loop through JSON response array: 
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 into your table 
insert ..... 
+0

我知道这两个工具。但我无法安装APEX或PL/JSON,因为我无法在生产中安装它们。我只能从本机PL/SQL代码中实现此功能。我正在使用12c数据库版本。 – Rohit