天天看點

Oracle使用utl_http通路webservice_老楊風子_新浪部落格

  Oracle使用utl_http通路webservice

 PLSQL通路webservice, utl_dbws是個不錯的選擇,另外的一種方式是直接構造http請求通路。

 這裡,使用了utl_http工具包,并使用了X MLTABLE+XPATH擷取請求的結果。

 另外,普通資料庫使用者需要預先授權。

 代碼如下:

DECLARE

  req     utl_http.req;

  resp    utl_http.resp;

  v_msg   VARCHAR2(80);

  v_url   VARCHAR2(32767) := 'http://120.131.70.71:8088/svc.asmx';

  v_name  VARCHAR2(32767);

  v_value VARCHAR2(32767);

  v_clob_content CLOB;

  --這裡是請求的内容

  v_content VARCHAR2(32767) := '

';

  v_xmltable xmltype;

BEGIN

  --utl_http.set_response_error_check ( enable => true );

  -- utl_http.set_detailed_excp_support ( enable => true );

  --dbms_output.put_line('STATUS CODE: ' || 'resp.status_code');

  req := utl_http.begin_request(v_url, 'POST', utl_http.http_version_1_1);

  utl_http.set_header(req, 'Content-Type', 'text/xml; charset=utf-8');

  --utl_http.set_header(req, 'Host', '220.168.42.13');

  utl_http.set_header(req, 'Content-Length', length(v_content));

  utl_http.write_text(req, v_content);

  resp := utl_http.get_response(r => req);

  dbms_output.put_line('STATUS CODE: ' || resp.status_code);

  dbms_output.put_line('REASON PHRASE: ' || resp.reason_phrase);

  BEGIN

    LOOP

      utl_http.read_line(resp, v_value, TRUE);

      v_clob_content := v_clob_content || v_value;

      --dbms_output.put_line(v_value);

    END LOOP;

    utl_http.end_response(r => resp);

  EXCEPTION

    WHEN OTHERS THEN

      --dbms_output.put_line(SQLCODE || ':' || SQLERRM);

      --dbms_output.put_line(dbms_utility.format_error_backtrace);

      --dbms_output.put_line(dbms_utility.format_error_stack);

      utl_http.end_response(r => resp);

  END;

  --dbms_output.put_line(v_clob_content);

  --dbms_output.put_line(v_clob_content);

  v_xmltable := xmltype(v_clob_content);

  --這裡解析傳回的結果 如果有namespace需要在extract參數裡聲明。

  --dbms_output.put_line(v_xmltable.extract('/soap:Envelope/soap:Body/svc_aboutResponse/svc_aboutResult/text()', 'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"')

  --                     .getclobval());

  dbms_output.put_line(v_xmltable.extract('/soap:Envelope/soap:Body/svc_aboutResponse/svc_aboutResult/text()', 'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="h2"').getclobval());

EXCEPTION

  WHEN OTHERS THEN

    dbms_output.put_line(SQLCODE || ':' || SQLERRM);

    dbms_output.put_line(dbms_utility.format_error_backtrace);

    dbms_output.put_line(dbms_utility.format_error_stack);

    --utl_http.end_response(r => resp);

END;