1

Oracle 11g には、UTL_HTTP を使用して Web サービスを利用する機能があります。SOAP 応答を CLOB に格納しています。

何時間も調査した後も、clob 内の XML フィールドを直接解析する方法はまだ見つかりません。

clob 内の SOAP 応答は次のようになります。

(CLOB) <?xml version="1.0" ?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GET_PERMITOutput xmlns="http://xmlns.oracle.com/orawsv/DBUSER/MYSERV">
      <RETURN>
        <STATUS_CODES>
          <stat>REC</stat>
        </STATUS_CODES>
      </RETURN>
    </GET_PERMITOutput>
  </soap:Body>
</soap:Envelope>

その値「REC」を解析して (それ以外の場合は複数のステータス コードがあります)、関数でそれを処理できるようにしたいと考えています。

4

2 に答える 2

2

XMLTypeまず、XML を列に格納する方がおそらく簡単でしょう。CLOBそれ以外の場合は、データを解析するために、実行時に を に変換する必要がありXMLTypeます。

ただし、から始めていると仮定すると、次のCLOBようなことができるはずです

select xmltype( xml_response ).extract('//stat/text()',
                                       'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" ' ||
                                       'xmlns="http://xmlns.oracle.com/orawsv/DBUSER/MYSERV').getStringVal()
 from foo

データを抽出します。私のテストでは、CLOB

SQL> create table foo(
  2    xml_response clob
  3  );

Table created.

サンプルデータを挿入しました

SQL> insert into foo values( '<?xml version="1.0" ?>
  2  <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  3    <soap:Body>
  4      <GET_PERMITOutput xmlns="http://xmlns.oracle.com/orawsv/DBUSER/MYSERV">
  5        <RETURN>
  6          <STATUS_CODES>
  7            <stat>REC</stat>
  8          </STATUS_CODES>
  9        </RETURN>
 10      </GET_PERMITOutput>
 11    </soap:Body>
 12  </soap:Envelope>');

1 row created.

そして、それを抽出するクエリを書きました

SQL> ed
Wrote file afiedt.buf

  1  select xmltype( xml_response ).extract('//stat/text()',
  2                                         'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" ' ||
  3                                         'xmlns="http://xmlns.oracle.com/orawsv/DBUSER/MYSERV').getStringVal()
  4*  from foo
SQL> /

XMLTYPE(XML_RESPONSE).EXTRACT('//STAT/TEXT()','XMLNS:SOAP="HTTP://SCHEMAS.XMLSOA
--------------------------------------------------------------------------------
REC
于 2012-06-28T20:28:32.763 に答える
0

一時テーブルに挿入することなくこれを行う方法を見つけました。私の関数は、CLOB の形式で SOAP 応答を取得し、それを「resp」という変数に格納します。これは、CLOB を一時的なものに挿入せずに以下で使用されます。

with t as (select xmltype(resp) xcol from dual)
  select status
  into tmp FROM t, XDBUSER.XDBUSER_XML
     , XMLTABLE( XMLNAMESPACES ('http://schemas.xmlsoap.org/soap/envelope/' as "soap", 'http://xmlns.oracle.com/orawsv/DBUSER/MYSERV' as "a")
        ,'/soap:Envelope/soap:Body/a:GET_PERMITOutput/a:RETURN/a:STATUS_CODES'
              PASSING XMLTYPE.CreateXML(XML_CLOB)
              COLUMNS "STATUS"  VARCHAR2(500) PATH 'a:stat');

返されるデータが 32767 バイトを超える可能性があるため、clob は XMLType よりもソープ リクエストを処理するためのより安全な方法です。

于 2012-06-29T15:42:51.980 に答える