ヘッダーをスキップ
Oracle® Application Express APIリファレンス
リリース4.2 for Oracle Database 12c
B71340-03
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

22 APEX_WEB_SERVICE

APEX_WEB_SERVICE APIを使用すると、PL/SQLを使用できるアプリケーション内の任意の場所でWebサービスと対話できるため、Application Expressと他のシステムを統合できます。APIには、SOAPおよびRESTful形式のWebサービスをコールするためのプロシージャおよびファンクションが含まれます。また、Webサービスからのレスポンスを解析し、SOAP対応のbase64エンコーディングにエンコード/デコードするファンクションが含まれます。このAPIには、APIからかWebサービス・タイプの標準プロセスを使用するかにかかわらず、WebサービスをコールするときにCookiesおよびHTTPヘッダーを管理するためのパッケージ・グローバルも含まれます。CookiesおよびHTTPヘッダーは、グローバルを移入することによってWebサービスへのコールを起動する前に設定でき、Webサービスのレスポンスから戻されたCookiesおよびHTTPヘッダーは、他のグローバルから読み取ることができます。

トピック:

APEX_WEB_SERVICE APIについて

APEX_WEB_SERVICE APIを使用して、Webサービスを起動し、PL/SQLを使用できるApplication Express内の任意の場所でレスポンスを調べます。

次のような場合に、APEX_WEB_SERVICE APIを使用します。

  • AJAXを使用してオンデマンド・プロセスでWebサービスを起動する場合。

  • 認証スキームの一部としてWebサービスを起動する場合。

  • base64でエンコードされたWebサービスにラージ・バイナリ・パラメータを渡す必要がある場合。

  • 検証の一部としてWebサービスを起動する場合。

トピック:

SOAP形式のWebサービスの起動

SOAP形式のWebサービスを起動するプロシージャおよびファンクションがあります。プロシージャは、パラメータp_collection_nameによって指定されたコレクションのレスポンスを格納します。ファンクションは、結果をXMLTYPEとして戻します。レスポンスから特定の値を取得するには、結果がコレクションに格納される場合はPARSE_RESPONSEファンクションを、レスポンスがXMLTYPEとして戻される場合はPARSE_XMLファンクションを使用します。base64でエンコードされた文字データとしてバイナリ・パラメータをWebサービスに渡すには、BLOB2CLOBBASE64ファンクションを使用します。逆に、base64でエンコードされたバイナリ・パラメータを含むレスポンスを変換するには、CLOBBASE642BLOBファンクションを使用します。次に、BLOB2CLOBBASE64ファンクションを使用してパラメータをエンコードし、MAKE_REQUESTプロシージャを使用してWebサービスをコールし、PARSE_RESPONSEファンクションを使用してレスポンスから特定の値を抽出する例を示します。

declare
 l_filename varchar2(255);
 l_BLOB BLOB;
 l_CLOB CLOB;
 l_envelope CLOB;
 l_response_msg varchar2(32767);
BEGIN
 IF :P1_FILE IS NOT NULL THEN
    SELECT filename, BLOB_CONTENT
      INTO l_filename, l_BLOB
      FROM APEX_APPLICATION_FILES
      WHERE name = :P1_FILE;
 
    l_CLOB := apex_web_service.blob2clobbase64(l_BLOB);
 
   l_envelope := q'!<?xml version='1.0' encoding='UTF-8'?>!';
   l_envelope := l_envelope '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:chec="http://www.stellent.com/CheckIn/">
  <soapenv:Header/>
  <soapenv:Body>
     <chec:CheckInUniversal>
        <chec:dDocName>'||l_filename||'</chec:dDocName>
        <chec:dDocTitle>'||l_filename||'</chec:dDocTitle>
        <chec:dDocType>Document</chec:dDocType>
        <chec:dDocAuthor>GM</chec:dDocAuthor>
        <chec:dSecurityGroup>Public</chec:dSecurityGroup>
        <chec:dDocAccount></chec:dDocAccount>
        <chec:CustomDocMetaData>
           <chec:property>
              <chec:name></chec:name>
              <chec:value></chec:value>
           </chec:property>
        </chec:CustomDocMetaData>
        <chec:primaryFile>
           <chec:fileName>'||l_filename'||</chec:fileName>
           <chec:fileContent>'||l_CLOB||'</chec:fileContent>
        </chec:primaryFile>
        <chec:alternateFile>
           <chec:fileName></chec:fileName>
           <chec:fileContent></chec:fileContent>
        </chec:alternateFile>
        <chec:extraProps>
           <chec:property>
              <chec:name></chec:name>
              <chec:value></chec:value>
           </chec:property>
        </chec:extraProps>
     </chec:CheckInUniversal>
  </soapenv:Body>
</soapenv:Envelope>';
 
apex_web_service.make_request(
   p_url               => 'http://127.0.0.1/idc/idcplg',
   p_action            => 'http://www.stellent.com/CheckIn/',
   p_collection_name   => 'STELLENT_CHECKIN',
   p_envelope          => l_envelope,
   p_username          => 'sysadmin',
   p_password          => 'welcome1' );
 
 l_response_msg := apex_web_service.parse_response(
  p_collection_name=>'STELLENT_CHECKIN',
p_xpath=>'//idc:CheckInUniversalResponse/idc:CheckInUniversalResult/idc:StatusInfo/idc:statusMessage/text()',
  p_ns=>'xmlns:idc="http://www.stellent.com/CheckIn/"');
 
 :P1_RES_MSG := l_response_msg;
 
 END IF;
END;

RESTful形式のWebサービスの起動

RESTful形式のWebサービスでは、SOAPより単純なアーキテクチャを使用します。通常、RESTful形式のWebサービスへの入力は、名前/値ペアのコレクションです。レスポンスは、XML文書またはカンマ区切りのレスポンスやJSONなどの単純なテキストです。次に、AJAXからコールできるアプリケーション・プロセスで使用されているMAKE_REST_REQUESTの例を示します。

declare
  l_clob clob;
  l_buffer         varchar2(32767);
  l_amount         number;
  l_offset         number;
begin
 
  l_clob := apex_web_service.make_rest_request(
              p_url => 'http://us.music.yahooapis.com/ video/v1/list/published/popular',
              p_http_method => 'GET',
              p_parm_name => apex_util.string_to_table('appid:format'),
              p_parm_value => apex_util.string_to_table(apex_application.g_x01||':'||apex_application.g_x02));
 
    l_amount := 32000;
    l_offset := 1;
    begin
        loop
            dbms_lob.read( l_clob, l_amount, l_offset, l_buffer );
            htp.p(l_buffer);
            l_offset := l_offset + l_amount;
            l_amount := 32000;
        end loop;
    exception
        when no_data_found then
            null;
    end;
 
end;

CookiesおよびHTTPヘッダーの取得

Application Expressでサポートされているいずれかのメソッドを使用してWebサービスを起動すると、WebサービスのレスポンスにCookiesまたはHTTPヘッダーが含まれていた場合、g_response_cookiesおよびg_headersグローバルが移入されます。これらのグローバルは問合せが可能で、コレクションに情報を格納できます。次に、APEX_WEB_SERVICEグローバルを問い合せてCookieおよびHTTPヘッダーのレスポンスをコレクションに格納する例を示します。

declare
  i number;
  secure varchar2(1);
begin
  apex_collection.create_or_truncate_collection('P31_RESP_COOKIES');
  for i in 1.. apex_web_service.g_response_cookies.count loop
    IF (apex_web_service.g_response_cookies(i).secure) THEN
      secure := 'Y';
    ELSE
      secure := 'N';
    END IF;
    apex_collection.add_member(p_collection_name => 'P31_RESP_COOKIES',
      p_c001 => apex_web_service.g_response_cookies(i).name,
      p_c002 => apex_web_service.g_response_cookies(i).value,
      p_c003 => apex_web_service.g_response_cookies(i).domain,
      p_c004 => apex_web_service.g_response_cookies(i).expire,
      p_c005 => apex_web_service.g_response_cookies(i).path,
      p_c006 => secure,
      p_c007 => apex_web_service.g_response_cookies(i).version );
  end loop;
end;
 
declare
  i number;
begin
apex_collection.create_or_truncate_collection('P31_RESP_HEADERS');
 
for i in 1.. apex_web_service.g_headers.count loop
  apex_collection.add_member(p_collection_name => 'P31_RESP_HEADERS',
    p_c001 => apex_web_service.g_headers(i).name,
    p_c002 => apex_web_service.g_headers(i).value,
    p_c003 => apex_web_service.g_status_code);
end loop;
end;

CookiesおよびHTTPヘッダーの設定

Webサービスを起動するプロセスの前に、グローバルg_request_cookiesおよびg_request_headersを移入することによって、Webサービス・リクエストとともに送信する必要があるCookiesおよびHTTPヘッダーを設定します。次に、グローバルを移入して、リクエストとともにCookiesおよびHTTPヘッダーを送信する例を示します。

for c1 in (select seq_id, c001, c002, c003, c004, c005, c006, c007
             from apex_collections
            where collection_name = 'P31_RESP_COOKIES' ) loop
  apex_web_service.g_request_cookies(c1.seq_id).name := c1.c001;
  apex_web_service.g_request_cookies(c1.seq_id).value := c1.c002;
  apex_web_service.g_request_cookies(c1.seq_id).domain := c1.c003;
  apex_web_service.g_request_cookies(c1.seq_id).expire := c1.c004;
  apex_web_service.g_request_cookies(c1.seq_id).path := c1.c005;
  if c1.c006 = 'Y' then
    apex_web_service.g_request_cookies(c1.seq_id).secure := true;
  else
    apex_web_service.g_request_cookies(c1.seq_id).secure := false;
  end if;
  apex_web_service.g_request_cookies(c1.seq_id).version := c1.c007;
end loop;
 
for c1 in (select seq_id, c001, c002
             from apex_collections
            where collection_name = 'P31_RESP_HEADERS' ) loop
  apex_web_service.g_request_headers(c1.seq_id).name := c1.c001;
  apex_web_service.g_request_headers(c1.seq_id).value := c1.c002;
end loop;

BLOB2CLOBBASE64ファンクション

このファンクションを使用して、BLOBデータ型を、base64でエンコードされたCLOBに変換します。通常、バイナリをWebサービスへの入力として送信する場合に使用します。

構文

APEX_WEB_SERVICE.BLOB2CLOBBASE64 (
            p_blob IN BLOB)
RETURN CLOB;

パラメータ

表22-1では、BLOB2CLOBBASE64ファンクションで使用可能なパラメータについて説明します。

表22-1 BLOB2CLOBBASE64のパラメータ

パラメータ 説明

p_blob

base64でエンコードされたCLOBに変換するBLOB。


次に、apex_application_filesビューからアンロードされたファイルを取得し、BLOBをbase64でエンコードされたCLOBに変換する例を示します。

declare
        l_clob   CLOB;
    l_blob       BLOB;
begin
    SELECT BLOB_CONTENT
      INTO l_BLOB
      FROM APEX_APPLICATION_FILES
      WHERE name = :P1_FILE;
 
    l_CLOB := apex_web_service.blob2clobbase64(l_BLOB);
end;

CLOBBASE642BLOBファンクション

このファンクションを使用して、base64でエンコードされたCLOBデータ型をBLOBに変換します。通常、バイナリ・パラメータを含むWebサービスから出力を取得する場合に使用します。

構文

APEX_WEB_SERVICE.CLOBBASE642BLOB (
            p_clob IN CLOB)
RETURN BLOB;

パラメータ

表22-2では、CLOBBASE642BLOBファンクションで使用可能なパラメータについて説明します。

表22-2 CLOBBASE642BLOBパラメータ

パラメータ 説明

p_clob

BLOBに変換するbase64でエンコードされたCLOB。


次に、base64でエンコードされたノードをXML文書からCLOBとして取得し、BLOBに変換する例を示します。

declare
            l_base64     CLOB;
    l_blob       BLOB;
    l_xml        XMLTYPE;
begin
    l_base64 := apex_web_service.parse_xml_clob(l_xml, ' //runReportReturn/reportBytes/text()');
        l_blob := apex_web_service.clobbase642blob(l_base64);
end;

MAKE_REQUESTプロシージャ

このプロシージャを使用して、指定されたSOAPエンベロープとともにSOAP形式のWebサービスを起動し、結果をコレクションに格納します。

構文

APEX_WEB_SERVICE.MAKE_REQUEST (
    p_url               IN VARCHAR2,
    p_action            IN VARCHAR2 default null,
    p_version           IN VARCHAR2 default '1.1',
    p_collection_name   IN VARCHAR2 default null,
    p_envelope          IN CLOB,
    p_username          IN VARCHAR2 default null,
    p_password          IN VARCHAR2 default null,
    p_proxy_override    IN VARCHAR2 default null,
    p_transfer_timeout  IN NUMBER   default 180,
    p_wallet_path       IN VARCHAR2 default null,
    p_wallet_pwd        IN VARCHAR2 default null );

パラメータ

表22-3では、MAKE_REQUESTプロシージャで使用可能なパラメータについて説明します。

表22-3 MAKE_REQUESTプロシージャのパラメータ

パラメータ 説明

p_url

WebサービスのURLエンドポイント。

p_action

起動する操作に対応するSOAPアクション。

p_version

SOAPのバージョン(1.1または1.2)。デフォルトは1.1。

p_collection_name

レスポンスを格納するコレクションの名前。

p_envelope

サービスにポストするSOAPエンベロープ。

p_username

このサービスに基本認証が必要な場合はユーザー名。

p_password

このサービスに基本認証が必要な場合はパスワード。

p_proxy_override

リクエストに使用するプロキシ。指定したプロキシは、アプリケーション属性で定義したプロキシより優先されます。

p_transfer_timeout

レスポンスを待機する時間(秒単位)。

p_wallet_path

URLエンドポイントがHTTPSの場合はウォレットへのファイル・システム・パス。file:/usr/home/oracle/WALLETSなど。指定されたウォレットのパスは、インスタンス設定で定義したウォレットより優先されます。

p_wallet_pwd

ウォレットにアクセスするためのパスワード。


次の例では、make_requestプロシージャを使用して、SOAP形式のWebサービスからムービーのリストを取得します。レスポンスはApplication ExpressコレクションMOVIE_LISTINGSに格納されます。

declare
        l_envelope CLOB;
BEGIN
        l_envelope := '<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:tns="http://www.ignyte.com/whatsshowing"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <tns:GetTheatersAndMovies>
         <tns:zipCode>43221</tns:zipCode>
         <tns:radius>5</tns:radius>
      </tns:GetTheatersAndMovies>
   </soap:Body>
</soap:Envelope>';
 
apex_web_service.make_request(
   p_url               => ' http://www.ignyte.com/webservices/ignyte.whatsshowing.webservice/moviefunctions.asmx',
   p_action            => ' http://www.ignyte.com/whatsshowing/GetTheatersAndMovies',
   p_collection_name   => 'MOVIE_LISTINGS',
   p_envelope          => l_envelope
);
END;

MAKE_REQUESTファンクション

このファンクションを使用して、指定されたSOAPエンベロープとともにSOAP形式のWebサービスを起動し、XMLTYPEで結果を戻します。

構文

APEX_WEB_SERVICE.MAKE_REQUEST (
    p_url               IN VARCHAR2,
    p_action            IN VARCHAR2 default null,
    p_version           IN VARCHAR2 default '1.1',
    p_envelope          IN CLOB,
    p_username          IN VARCHAR2 default null,
    p_password          IN VARCHAR2 default null,
    p_proxy_override    IN VARCHAR2 default null,
    p_transfer_timeout  IN NUMBER   default 180,
    p_wallet_path       IN VARCHAR2 default null,
    p_wallet_pwd        IN VARCHAR2 default null )
RETURN XMLTYPE;

パラメータ

表22-4では、MAKE_REQUESTファンクションで使用可能なパラメータについて説明します。

表22-4 MAKE_REQUESTファンクションのパラメータ

パラメータ 説明

p_url

WebサービスのURLエンドポイント。

p_action

起動する操作に対応するSOAPアクション。

p_version

SOAPのバージョン(1.1または1.2)。デフォルトは1.1。

p_envelope

サービスにポストするSOAPエンベロープ。

p_username

このサービスに基本認証が必要な場合はユーザー名。

p_password

このサービスに基本認証が必要な場合はパスワード。

p_proxy_override

リクエストに使用するプロキシ。指定したプロキシは、アプリケーション属性で定義したプロキシより優先されます。

p_transfer_timeout

レスポンスを待機する時間(秒単位)。

p_wallet_path

URLエンドポイントがHTTPSの場合はウォレットへのファイル・システム・パス。file:/usr/home/oracle/WALLETSなど。指定されたウォレットのパスは、インスタンス設定で定義したウォレットより優先されます。

p_wallet_pwd

ウォレットにアクセスするためのパスワード。


次の例では、make_requestファンクションを使用して、ムービーのリストを戻すSOAP形式のWebサービスを起動します。結果はXMLTYPEで格納されます。

declare
    l_envelope CLOB;
    l_xml        XMLTYPE;
BEGIN
            l_envelope := ' <?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:tns="http://www.ignyte.com/whatsshowing"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <tns:GetTheatersAndMovies>
            <tns:zipCode>43221</tns:zipCode>
            <tns:radius>5</tns:radius>
        </tns:GetTheatersAndMovies>
    </soap:Body>
</soap:Envelope>';
 
l_xml := apex_web_service.make_request(
    p_url => ' http://www.ignyte.com/webservices/ignyte.whatsshowing.webservice/moviefunctions.asmx',
   p_action => ' http://www.ignyte.com/whatsshowing/GetTheatersAndMovies',
   p_envelope => l_envelope
);
END

MAKE_REST_REQUESTファンクション

このファンクションを使用して、名前/値ペア、キャラクタベースのペーロード、バイナリ・ペイロードのいずれかを指定し、レスポンスをCLOBで戻して、RESTful形式のWebサービスを起動します。

構文

APEX_WEB_SERVICE.MAKE_REST_REQUEST(
    p_url               IN VARCHAR2,
    p_http_method       IN VARCHAR2,
    p_username          IN VARCHAR2 default null,
    p_password          IN VARCHAR2 default null,
    p_proxy_override    IN VARCHAR2 default null,
    p_transfer_timeout  IN NUMBER   default 180,
    p_body              IN CLOB default empty_clob(),
    p_body_blob         IN BLOB default empty_blob(),
    p_parm_name         IN apex_application_global.VC_ARR2 default empty_vc_arr,
    p_parm_value        IN apex_application_global.VC_ARR2 default empty_vc_arr,
    p_wallet_path       IN VARCHAR2 default null,
    p_wallet_pwd        IN VARCHAR2 default null ) 
RETURN CLOB;

パラメータ

表22-5では、MAKE_REST_REQUESTファンクションで使用可能なパラメータについて説明します。

表22-5 MAKE_REST_REQUESTファンクションのパラメータ

パラメータ 説明

p_url

WebサービスのURLエンドポイント。

p_http_method

使用するHTTPメソッド(PUT、POST、GET、HEADまたはDELETE)。

p_username

このサービスに基本認証が必要な場合はユーザー名。

p_password

このサービスに基本認証が必要な場合はパスワード。

p_proxy_override

リクエストに使用するプロキシ。指定したプロキシは、アプリケーション属性で定義したプロキシより優先されます。

p_transfer_timeout

レスポンスを待機する時間(秒単位)。

p_body

CLOBとして送信するHTTPペイロード。

p_body_blob

バイナリBLOBとして送信するHTTPペイロード。ファイルのポストなど。

p_parm_name

名前/値ペアで使用するパラメータの名前。

p_parm_value

名前/値ペアで使用するパラメータの値。

p_wallet_path

URLエンドポイントがHTTPSの場合はウォレットへのファイル・システム・パス。file:/usr/home/oracle/WALLETSなど。指定されたウォレットのパスは、インスタンス設定で定義したウォレットより優先されます。

p_wallet_pwd

ウォレットにアクセスするためのパスワード。


次の例では、make_rest_requestファンクションを使用して、パラメータを名前/値ペアとしてサービスに渡すRESTful形式のWebサービスをコールします。サービスからのレスポンスはローカルで宣言されたCLOBで格納されます。

declare
    l_clob       CLOB;
BEGIN
 
    l_clob := apex_web_service.make_rest_request(
        p_url => 'http://us.music.yahooapis.com/ video/v1/list/published/popular',
        p_http_method => 'GET',
        p_parm_name => apex_util.string_to_table('appid:format'),
        p_parm_value => apex_util.string_to_table('xyz:xml'));
 
END

PARSE_RESPONSEファンクション

このファンクションを使用して、コレクションに格納されたWebサービスからのレスポンスを解析し、結果をVARCHAR2型で戻します。

構文

APEX_WEB_SERVICE.PARSE_RESPONSE (
    p_collection_name   IN VARCHAR2,
    p_xpath             IN VARCHAR2,
    p_ns                IN VARCHAR2 default null ) 
RETURN VARCHAR2;

パラメータ

表22-6では、PARSE_RESPONSEファンクションで使用可能なパラメータについて説明します。

表22-6 PARSE_RESPONSEファンクションのパラメータ

パラメータ 説明

p_collection_name

Webサービスのレスポンスが格納されるコレクションの名前。

p_xpath

目的のノードへのXPath式。

p_ns

目的のノードへのネームスペース。


次の例では、STELLENT_CHECKINというコレクションに格納されたレスポンスを解析し、値をローカルで宣言されたVARCHAR2変数に格納します。

declare
    l_response_msg  VARCHAR2(4000);
BEGIN
    l_response_msg := apex_web_service.parse_response(
        p_collection_name=>'STELLENT_CHECKIN',
        p_xpath =>
'//idc:CheckInUniversalResponse/idc:CheckInUniversalResult/idc:StatusInfo/idc:statusMessage/text()',
        p_ns=>'xmlns:idc="http://www.stellent.com/CheckIn/"');
END;

PARSE_RESPONSE_CLOBファンクション

このファンクションを使用して、コレクションに格納されたWebサービスからのレスポンスを解析し、結果をCLOB型で戻します。

構文

APEX_WEB_SERVICE.PARSE_RESPONSE_CLOB (
    p_collection_name   IN VARCHAR2,
    p_xpath             IN VARCHAR2,
    p_ns                IN VARCHAR2 default null ) 
RETURN CLOB;

パラメータ

表22-7では、PARSE_RESPONSE_CLOBファンクションで使用可能なパラメータについて説明します。

表22-7 PARSE_RESPONSE _CLOBファンクションのパラメータ

パラメータ 説明

p_collection_name

Webサービスのレスポンスが格納されるコレクションの名前。

p_xpath

目的のノードへのXPath式。

p_ns

目的のノードへのネームスペース。


次の例では、STELLENT_CHECKINというコレクションに格納されたレスポンスを解析し、値をローカルで宣言されたCLOB変数に格納します。

declare
    l_response_msg  CLOB;
BEGIN
    l_response_msg := apex_web_service.parse_response_clob(
        p_collection_name=>'STELLENT_CHECKIN',
        p_xpath=>
'//idc:CheckInUniversalResponse/idc:CheckInUniversalResult/idc:StatusInfo/idc:statusMessage/text()',
        p_ns=>'xmlns:idc="http://www.stellent.com/CheckIn/"');
END;

PARSE_XMLファンクション

このファンクションを使用して、XMLTYPEとして戻されたWebサービスからのレスポンスを解析し、リクエストされた値をVARCHAR2として戻します。

構文

APEX_WEB_SERVICE.PARSE_XML (
    p_xml               IN XMLTYPE,
    p_xpath             IN VARCHAR2,
    p_ns                IN VARCHAR2 default null ) 
RETURN VARCHAR2;

パラメータ

表22-8に、PARSE_XMLファンクションで使用可能なパラメータを示します。

表22-8 PARSE_XMLファンクションのパラメータ

パラメータ 説明

p_xml

解析するXMLTYPEとしてのXML文書。

p_xpath

目的のノードへのXPath式。

p_ns

目的のノードへのネームスペース。


次の例では、make_requestファンクションを使用してWebサービスをコールし、結果をローカルのXMLTYPE変数に格納します。その後、XMLTYPEに格納されたXML文書の特定ノードの取得にparse_xmlファンクションが使用され、その結果をローカルに宣言されたVARCHAR2変数に格納します。

declare
    l_envelope CLOB;
    l_xml XMLTYPE;
    l_movie VARCHAR2(4000);
BEGIN
    l_envelope := ' <?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:tns="http://www.ignyte.com/whatsshowing"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <tns:GetTheatersAndMovies>
         <tns:zipCode>43221</tns:zipCode>
         <tns:radius>5</tns:radius>
      </tns:GetTheatersAndMovies>
   </soap:Body>
</soap:Envelope>';
 
   l_xml := apex_web_service.make_request(
     p_url => ' http://www.ignyte.com/webservices/ignyte.whatsshowing.webservice/moviefunctions.asmx',
     p_action => ' http://www.ignyte.com/whatsshowing/GetTheatersAndMovies',
     p_envelope => l_envelope );
 
   l_movie := apex_web_service.parse_xml(
     p_xml => l_xml,
     p_xpath => ' //GetTheatersAndMoviesResponse/GetTheatersAndMoviesResult/Theater/Movies/Movie/Name[1]',
     p_ns => ' xmlns="http://www.ignyte.com/whatsshowing"' );
 
END;

PARSE_XML_CLOBファンクション

このファンクションを使用して、XMLTYPEとして戻されたWebサービスからのレスポンスを解析し、リクエストされた値をCLOBとして戻します。

構文

APEX_WEB_SERVICE.PARSE_XML_CLOB (
    p_xml               IN XMLTYPE,
    p_xpath             IN VARCHAR2,
    p_ns                IN VARCHAR2 default null ) 
RETURN VARCHAR2;

パラメータ

表22-9では、PARSE_XML_CLOBファンクションで使用可能なパラメータについて説明します。

表22-9 PARSE_XML_CLOBファンクションのパラメータ

パラメータ 説明

p_xml

解析するXMLTYPEとしてのXML文書。

p_xpath

目的のノードへのXPath式。

p_ns

目的のノードへのネームスペース。


次の例では、make_requestファンクションを使用してWebサービスをコールし、結果をローカルのXMLTYPE変数に格納します。その後、XMLTYPEに格納されたXML文書の特定ノードの取得にparse_xmlファンクションが使用され、その結果をローカルに宣言されたVARCHAR2変数に格納します。

declare
    l_envelope CLOB;
    l_xml XMLTYPE;
    l_movie CLOB;
BEGIN
    l_envelope := ' <?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:tns="http://www.ignyte.com/whatsshowing"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <tns:GetTheatersAndMovies>
         <tns:zipCode>43221</tns:zipCode>
         <tns:radius>5</tns:radius>
      </tns:GetTheatersAndMovies>
   </soap:Body>
</soap:Envelope>';
 
   l_xml := apex_web_service.make_request(
     p_url => ' http://www.ignyte.com/webservices/ignyte.whatsshowing.webservice/moviefunctions.asmx',
     p_action => ' http://www.ignyte.com/whatsshowing/GetTheatersAndMovies',
     p_envelope => l_envelope );
 
   l_movie := apex_web_service.parse_xml_clob(
     p_xml => l_xml,
     p_xpath => ' //GetTheatersAndMoviesResponse/GetTheatersAndMoviesResult/Theater/Movies/Movie/Name[1]',
     p_ns => ' xmlns="http://www.ignyte.com/whatsshowing"' );
 
END;