How to Call Web Service from Oracle DB (UTL_DBWS)

Consuming Web Service In Oracle DB (UTL_DBWS)

本篇文章以UTL_DBWS Package來實現,請先滿足先決條件。下方將以實際案例說明如何透過PL/SQL實做呼叫Web Service。

DECLARE

  --UTL_DBWS Object
  L_SERVICE_QNAME   UTL_DBWS.QNAME;
  L_PORT_QNAME      UTL_DBWS.QNAME;
  L_OPERATION_QNAME UTL_DBWS.QNAME;
  L_SERVICE         UTL_DBWS.SERVICE;
  L_CALL            UTL_DBWS.CALL;

  --XMLTYPE
  L_XMLTYPE_IN  SYS.XMLTYPE;
  L_XMLTYPE_OUT SYS.XMLTYPE;

  --LOCAL VARIABLE
  X_CONTENT         CLOB;
  V_SERVICE_QNAME   VARCHAR2(4000) := NULL; --Web Service Name
  V_PORT_QNAME      VARCHAR2(4000) := NULL; --Web Service Queue Name
  V_OPERATION_QNAME VARCHAR2(4000) := NULL; --Web Service Operation Name
  V_WSDL_URL        VARCHAR2(4000) := NULL; --WSDL URL
  V_NAMESPACE       VARCHAR2(4000) := NULL; --NAMESPACE

  V_RESULT VARCHAR2(4000) := NULL; --Web Service Response Result in string
  V_EXCEPTION EXCEPTION;

BEGIN

  --SETUP LOCAL VARIABLE
  V_NAMESPACE       := 'http://www.xxxx.com';
  V_WSDL_URL        := 'http://xxxxxx.xxxx.com/XXXXX/UM_COMMON_W3_ERP_UTIL.asmx?WSDL'; --WSDL URL
  V_SERVICE_QNAME   := 'UM_COMMON_W3_ERP_UTIL'; --Web Service Name
  V_PORT_QNAME      := 'UM_COMMON_W3_ERP_UTILSoap12'; --Web Service Queue Name
  V_OPERATION_QNAME := 'getVersionID'; --Web Service Operation Name

  X_CONTENT    := 'XXXXXXXX'; --Web Service Parameter
  L_XMLTYPE_IN := SYS.XMLTYPE('<?xml version="1.0" encoding="utf-8"?>
   <getVersionID xmlns="http://www.xxxx.com"><s>' ||
                              X_CONTENT || '</s></getVersionID>');

  L_SERVICE_QNAME   := UTL_DBWS.TO_QNAME(V_NAMESPACE, V_SERVICE_QNAME);
  L_PORT_QNAME      := UTL_DBWS.TO_QNAME(V_NAMESPACE, V_PORT_QNAME);
  L_OPERATION_QNAME := UTL_DBWS.TO_QNAME(V_NAMESPACE, V_OPERATION_QNAME);

  --CREATE_SERVICE
  L_SERVICE := UTL_DBWS.CREATE_SERVICE(WSDL_DOCUMENT_LOCATION => URIFACTORY.GETURI(V_WSDL_URL),
                                       SERVICE_NAME           => L_SERVICE_QNAME);

  --CREATE_CALL
  L_CALL := UTL_DBWS.CREATE_CALL(SERVICE_HANDLE => L_SERVICE,
                                 PORT_NAME      => L_PORT_QNAME,
                                 OPERATION_NAME => L_OPERATION_QNAME);
  --INVOKE
  L_XMLTYPE_OUT := UTL_DBWS.INVOKE(CALL_HANDLE => L_CALL,
                                   REQUEST     => L_XMLTYPE_IN);

  --RELEASE RESOURCE
  UTL_DBWS.RELEASE_CALL(CALL_HANDLE => L_CALL);
  UTL_DBWS.RELEASE_SERVICE(SERVICE_HANDLE => L_SERVICE);

  --EXTRACT SPECIFIC RESPONSE 
  BEGIN
    V_RESULT := L_XMLTYPE_OUT.EXTRACT('getVersionIDResponse/getVersionIDResult/text()',
                                      'xmlns="http://www.xxxx.com"')
               .GETSTRINGVAL();
  EXCEPTION
    WHEN OTHERS THEN
      V_RESULT := NULL;
  END;

END;

Ref : 

https://oracle-base.com/articles/10g/utl_dbws-10g

https://docs.oracle.com/cd/B19306_01/appdev.102/b14258/u_dbws.htm#CHDJIBEA