在 PL/SQL 中通过 Webservice 处理 JSON 对象

Processing JSON object via Webservice in PL/SQL

我正在开发一个测试 Oracle 过程以从本地 XAMPP 托管的 Web 服务接收 JSON 对象。按照以下步骤操作。

(01) 创建了 ACL

set define off;
BEGIN
SYS.DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(acl         => 'www.xml',
                                    description => 'TEST JSON',
                                    principal   => 'TEST_USER',
                                    is_grant    => true,
                                    privilege   => 'connect',
                                    start_date   => SYSTIMESTAMP,
                                    end_date     => NULL);

SYS.DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(acl       => 'www.xml',
                                       principal => 'TEST_USER',
                                       is_grant  => true,
                                       privilege => 'resolve');

SYS.DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(acl  => 'www.xml',
                                    host        => 'localhost',
                                    lower_port  => 8081,
                                    upper_port  => NULL);
END;

(02) 以下是测试过程

create or replace PROCEDURE JSON11 IS
  l_param_list     VARCHAR2(512);
  l_http_request   UTL_HTTP.req;
  l_http_response  UTL_HTTP.resp;
  l_response_text  VARCHAR2(32767);
  l_list system.json_list;
  acl            VARCHAR2(100);
  url            VARCHAR2(1000) := 
  'http://localhost:8081/PhpProjectFirst/displayValuesSent.php?
  name=name11&email=name11@gmail.com&gender=male&course=OCA2&class=2008&s
  ubject=PL/SQL';

BEGIN
    DBMS_OUTPUT.put_line('start');
    l_http_request := utl_http.begin_request(url, 'POST','HTTP/1.1');
    DBMS_OUTPUT.put_line('aa');
    --utl_http.set_header(l_http_request, 'user-agent', 'mozilla/4.0'); 
    utl_http.set_header(l_http_request, 'Content-Type', 'application/json'); 
    --utl_http.set_header(l_http_request, 'Content-Length', 
    length(content));    
    --utl_http.write_text(l_http_request, content);
    DBMS_OUTPUT.put_line('bb');
    l_http_response := utl_http.get_response(l_http_request);
    DBMS_OUTPUT.put_line('cc');

    -- process the response from the HTTP call
    begin
        loop
            utl_http.read_line(l_http_response, l_response_text);
            dbms_output.put_line(l_response_text);
        end loop;
        utl_http.end_response(l_http_response);

    end;   
exception
    when utl_http.end_of_body then
        utl_http.end_response(l_http_response);
    when others then
        DBMS_OUTPUT.put_line('Error >> '||sqlerrm);
END JSON11;

(03) 调用了过程

set serveroutput on size 30000;
BEGIN
  JSON11();
END;

但以以下错误结束。

Error >> ORA-29273: HTTP request failed
ORA-06512: at "SYS.UTL_HTTP", line 1130
ORA-29270: too many open HTTP requests

DB 是 Oracle XE 并使用 Oracle SQL Developer。 Webservice 非常简单,运行 通过 XAMPP 和 returns 一个简单的 JSON 对象。

可以分享任何提示吗?

此致, LM

每个会话最多可以有 5 个 HTTP 请求。 对于该过程的每个 运行,您都在创建一个新连接,但并不总是关闭它。 您仅在 when utl_http.end_of_body then 中关闭您的连接,但您也应该在 when others then 中关闭它。