通过pl / sql块调用webservice

时间:2010-10-25 06:42:14

标签: sql web-services plsql invoke

如何通过pl / sql块调用web服务,我们知道url,用户名和密码。

如何看待回复?

提供一些示例代码......

提前致谢

我使用了以下代码:

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;
/

3 个答案:

答案 0 :(得分:4)

我使用pl / sql的web服务没有问题! 我正在使用这个(+我自己的改进):http://www.oracle-base.com/dba/miscellaneous/soap_api.sql

确保正确定义名称空间,我认为你应该只使用它来检索ASCII而不是二进制数据......

答案 1 :(得分: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;

答案 2 :(得分:-1)

即使有办法做到这一点,这也是一种非常糟糕的做法!

此外,这里有很多问题。这项服务将返回什么?你如何将结果解析为sql可以理解的东西?您如何处理从服务中返回的错误?

只需返回返回应用程序所需的任何内容,让应用程序调用Web服务。