2010-10-25 62 views
1

如何通過我們知道url,用戶名和密碼的pl/sql塊調用webservice。通過pl/sql塊調用webservice

以及如何查看響應?

給一些示例代碼...

在此先感謝

我用下面的代碼:

CREATE OR REPLACE FUNCTION READ_DATA_FROM_WS (url IN VARCHAR2, 
               username IN VARCHAR2, 
               password IN VARCHAR2) 
    RETURN CLOB 
IS 
    req   UTL_HTTP.req; 
    resp   UTL_HTTP.resp; 
    DATA   VARCHAR2 (2000); 
    data1   CLOB; 
    def_timeout PLS_INTEGER; 
    l_envelope  VARCHAR2(32767); 
BEGIN 
req := utl_http.begin_request(url, 'POST','HTTP/1.0'); 

UTL_HTTP.set_authentication (req, username, password); 
utl_http.set_header(req, 'Content-Type', 'text/xml'); 

resp := utl_http.get_response(req); 

    IF (resp.status_code = UTL_HTTP.http_ok) 
    THEN 
     UTL_HTTP.set_body_charset (resp, 'UTF-8');  
    BEGIN 
     LOOP 
      UTL_HTTP.read_text (resp, DATA); 
      data1 := data1 || DATA;   
     END LOOP; 
     EXCEPTION 
     WHEN UTL_HTTP.end_of_body 
     THEN  
      UTL_HTTP.end_response (resp); 
      UTL_HTTP.set_transfer_timeout (def_timeout); 
     WHEN OTHERS 
     THEN 
      NULL; 
     END; 
     UTL_HTTP.set_transfer_timeout (def_timeout); 
    ELSE 
     UTL_HTTP.end_response (resp); 
     DBMS_OUTPUT.put_line ('HTTP response status code: ' || resp.status_code); 
    END IF; 
    RETURN (data1); 
END read_data_from_ws; 
/

回答

-2

即使是有辦法做到這一點,將是一個非常糟糕的做法!

另外,這裏有很多問題。這項服務將返回什麼?你如何將結果解析爲sql可以理解的東西?你將如何處理從服務返回的錯誤?

只要返回所需的任何內容即可返回到應用程序並讓應用程序調用Web服務。

+1

爲什麼這是不好的做法?如果PL/SQL是整個系統寫入的主要語​​言,那麼它不是壞習慣。請解釋你背後的理由。 – jezzipin 2012-12-18 08:46:23

4

我已經使用pl/sql的Web服務沒有問題! 我用這一個(+我自己的改進):http://www.oracle-base.com/dba/miscellaneous/soap_api.sql

要確保你正確地定義命名空間,我想你應該只使用這個檢索ASCII而不是二進制數據...

+0

哈哈,爲什麼減點? – 2010-10-25 09:08:11

+0

其他評論根本沒有回答這個問題!只是說一些他們不瞭解Web服務和SOAP消息的概念。你給了我-1,你應該首先調查問題,再想一想。 – 2010-10-25 09:34:47

+0

我不知道它是如何得到-1 ...我是新來這..可能是錯誤我點擊了一些地方...道歉:( – 2010-10-25 12:28:00

0

這裏是一些示例代碼。留下一些碎片,但它給你一個想法。該函數返回WMS Web服務的功能XML。

function getcapabilities(p_url  varchar2 
          ,p_version varchar2) return xmltype is 
     pragma autonomous_transaction; 

     req    utl_http.req; 
     resp    utl_http.resp; 
     c     varchar2(255); 
     l_clob    clob; 
    begin 
     dbms_lob.createtemporary(lob_loc => l_clob, cache => true, dur => dbms_lob.call); 
     -- ----------------------------------- 
     -- OPEN TEMPORARY LOB FOR READ/WRITE 
     -- ----------------------------------- 
     dbms_lob.open(lob_loc => l_clob, open_mode => dbms_lob.lob_readwrite); 

     utl_http.set_proxy(proxy => <proxy>, no_proxy_domains => <no_proxy>); 

     /* request that exceptions are raised for error Status Codes */ 
     utl_http.set_response_error_check(enable => true); 

     /* allow testing for exceptions like Utl_Http.Http_Server_Error */ 
     utl_http.set_detailed_excp_support(enable => true); 

     if instr(p_url, '?') > 0 
     then 
     req := utl_http.begin_request(p_url || '&REQUEST=GetCapabilities&SERVICE=WMS&VERSION=' || 
             p_version); 
     else 
     req := utl_http.begin_request(p_url || '?REQUEST=GetCapabilities&SERVICE=WMS&VERSION=' || 
             p_version); 
     end if; 

     utl_http.set_header(req, 'User-Agent', 'Mozilla/4.0'); 
     resp := utl_http.get_response(req); 

     begin 
     loop 
      utl_http.read_text(r => resp, data => c); 

      /* function that adds a string to a clob */ 
      add_to_clob(l_clob, c); 

     end loop; 
     exception 
     when utl_http.end_of_body then 
      null; 
     when others then 
      raise; 
     end; 

     utl_http.end_response(resp); 

     dbms_lob.close(lob_loc => l_clob); 

     /* this was for some Oracle bug */ 
     execute immediate 'alter session set events =''31156 trace name context forever, level 2'''; 
     commit; 
     return xmltype.createxml(l_clob); 
    end;