Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - プログラミング » SQL Anywhere データ・アクセス API » SQL Anywhere Web サービス

 

構造化されたデータ型の使用

XML 戻り値

Web サービス・クライアントとしての SQL Anywhere は、関数やプロシージャを使用する Web サービスに対するインタフェースになることがあります。

単純な戻り値のデータ型には、結果セット内の文字列表現で十分な場合があります。このような場合、ストアド・プロシージャの使用が可能になります。

配列や構造体などの複雑なデータを返すときは、Web サービス関数を使用する方が適しています。関数の宣言では、RETURN 句で XML データ型を指定できます。目的の要素を抽出するために、返された XML は OPENXML を使用して解析することができます。

dateTime などの XML データの戻り値は、結果セット内にそのままで現れます。たとえば TIMESTAMP カラムが結果セットに含まれる場合は、文字列 (2006-12-25 12:00:00.000) ではなく、XML dateTime 文字列 (2006-12-25T12:00:00.000-05:00) のようにフォーマットされます。

XML パラメータ値

SQL Anywhere XML データ型は、Web サービス関数とプロシージャ内のパラメータとして使用できます。単純な型の場合、SOAP 要求の本文が生成されるときに、パラメータ要素が自動的に構成されます。しかし、XML 型のパラメータの場合、要素の XML 表現で追加のデータを提供する属性が必要になることがあるため、自動的に構成できません。そのため、データ型が XML のパラメータに対して XML を生成するときは、ルート要素の名前をパラメータ名と一致させる必要があります。

<inputHexBinary xsi:type="xsd:hexBinary">414243</inputHexBinary>

この XML 型は、パラメータを hexBinary XML 型として送信する方法の例を示しています。SOAP 終了ポイントは、パラメータ名 (XML 用語ではルート要素名) が inputHexBinary であることを想定しています。

Cookbook 定数

複雑な構造体や配列を構築するには、SQL Anywhere がネームスペースを参照する方法を知ることが必要です。次に示すプレフィクスは、SQL Anywhere SOAP 要求エンベロープ用に生成されるネームスペース宣言に対応します。

SQL Anywhere の XML プレフィクス ネームスペース
xsd http://www.w3.org/2001/XMLSchema
xsi http://www.w3.org/2001/XMLSchema-instance
SOAP-ENC http://schemas.xmlsoap.org/soap/encoding/
m NAMESPACE 句で定義されたネームスペース
複雑なデータ型の例

配列、構造体、構造体の配列をそれぞれ表すパラメータを取る Web サービス・クライアント関数を作成する方法を次の 3 つの例で示します。これらの例は、Microsoft SOAP ToolKit 3.0 Round 2 相互運用性テスト・サーバ ([external link] http://mssoapinterop.org/stkV3) に対して要求を発行するように設計されています。Web サービス関数は、それぞれ echoFloatArray、echoStruct、echoStructArray という SOAP 操作 (または RPC 関数名) と通信します。相互運用性テストで共通で使用されるネームスペースは http://soapinterop.org/ で、URL 句を目的の SOAP 終了ポイントに変更するだけで、関数を代替相互運用サーバに対してテストすることができます。

これら 3 つの例では、テーブルを使用して XML データを生成します。このテーブルを設定する方法は次のとおりです。

CREATE LOCAL TEMPORARY TABLE SoapData
(
    seqno INT DEFAULT AUTOINCREMENT,
    i INT,
    f FLOAT,
    s LONG VARCHAR
) ON COMMIT PRESERVE ROWS;

INSERT INTO SoapData (i,f,s) 
VALUES (99,99.999,'Ninety-Nine');

INSERT INTO SoapData (i,f,s) 
VALUES (199,199.999,'Hundred and Ninety-Nine');

次の 3 つの関数は、SOAP 要求を相互運用サーバに送信します。このサンプルでは、Microsoft の Interop サーバに対して要求を発行します。

CALL sa_make_object('function', 'echoFloatArray');
ALTER FUNCTION echoFloatArray( inputFloatArray XML )
RETURNS XML
URL 'http://mssoapinterop.org/stkV3/Interop.wsdl'
HEADER 'SOAPAction:"http://soapinterop.org/"'
NAMESPACE 'http://soapinterop.org/';

CALL sa_make_object('function', 'echoStruct');
ALTER FUNCTION echoStruct( inputStruct XML )
RETURNS XML
URL 'http://mssoapinterop.org/stkV3/Interop.wsdl'
HEADER 'SOAPAction:"http://soapinterop.org/"'
NAMESPACE 'http://soapinterop.org/';

CALL sa_make_object('function', 'echoStructArray');
ALTER FUNCTION echoStructArray( inputStructArray XML )
RETURNS XML
URL 'http://mssoapinterop.org/stkV3/Interop.wsdl'
HEADER 'SOAPAction:"http://soapinterop.org/"'
NAMESPACE 'http://soapinterop.org/';

最後に、例の文を 3 つ示します。それぞれのパラメータは XML 表現で表されています。

  1. 次の例のパラメータは、配列を表します。

    SELECT echoFloatArray(
        XMLELEMENT( 'inputFloatArray',
           XMLATTRIBUTES( 'xsd:float[]' as "SOAP-ENC:arrayType" ),
            ( 
            SELECT XMLAGG( XMLELEMENT( 'number', f ) ORDER BY seqno )
            FROM SoapData 
            )
        )
    );

    ストアド・プロシージャ echoFloatArray は、次の XML を相互運用サーバに送信します。

    <inputFloatArray SOAP-ENC:arrayType="xsd:float[2]">
    <number>99.9990005493164</number>
    <number>199.998992919922</number>
    </inputFloatArray>

    相互運用サーバからの応答は次のようになります。

    '<?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <SOAP-ENV:Envelope
      xmlns:SOAPSDK1="http://www.w3.org/2001/XMLSchema"
      xmlns:SOAPSDK2="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:SOAPSDK3="http://schemas.xmlsoap.org/soap/encoding/"
      xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
      <SOAP-ENV:Body
        SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
        <SOAPSDK4:echoFloatArrayResponse
          xmlns:SOAPSDK4="http://soapinterop.org/">
          <Result SOAPSDK3:arrayType="SOAPSDK1:float[2]"
            SOAPSDK3:offset="[0]"
            SOAPSDK2:type="SOAPSDK3:Array">
            <SOAPSDK3:float>99.9990005493164</SOAPSDK3:float>
            <SOAPSDK3:float>199.998992919922</SOAPSDK3:float>
          </Result>
        </SOAPSDK4:echoFloatArrayResponse>
      </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>'

    応答が変数に格納された場合は、OPENXML を使用して解析できます。

    SELECT * FROM openxml( resp,'//*:Result/*' ) 
    WITH ( varFloat FLOAT 'text()' );
    varFloat
    99.9990005493
    199.9989929199
  2. 次の例のパラメータは、構造体を表します。

    SELECT echoStruct(
        XMLELEMENT('inputStruct', 
            (
            SELECT XMLFOREST( s as varString,
                              i as varInt,
                              f as varFloat )
            FROM SoapData 
            WHERE seqno=1 
            ) 
        )
    );

    ストアド・プロシージャ echoStruct は、次の XML を相互運用サーバに送信します。

    <inputStruct>
      <varString>Ninety-Nine</varString>
      <varInt>99</varInt>
      <varFloat>99.9990005493164</varFloat>
    </inputStruct>

    相互運用サーバからの応答は次のようになります。

    '<?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <SOAP-ENV:Envelope
      xmlns:SOAPSDK1="http://www.w3.org/2001/XMLSchema"
      xmlns:SOAPSDK2="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:SOAPSDK3="http://schemas.xmlsoap.org/soap/encoding/"
      xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
      <SOAP-ENV:Body
        SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
        <SOAPSDK4:echoStructResponse
          xmlns:SOAPSDK4="http://soapinterop.org/">
          <Result href="#id1"/>
        </SOAPSDK4:echoStructResponse>
        <SOAPSDK5:SOAPStruct
          xmlns:SOAPSDK5="http://soapinterop.org/xsd"
          id="id1"
          SOAPSDK3:root="0"
          SOAPSDK2:type="SOAPSDK5:SOAPStruct">
          <varString>Ninety-Nine</varString>
          <varInt>99</varInt>
          <varFloat>99.9990005493164</varFloat>
        </SOAPSDK5:SOAPStruct>
      </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>'

    応答が変数に格納された場合は、OPENXML を使用して解析できます。

    SELECT * FROM openxml( resp,'//*:Body/*:SOAPStruct' ) 
    WITH (
    varString LONG VARCHAR 'varString',
    varInt INT 'varInt',
    varFloat FLOAT 'varFloat' );
    varString varInt varFloat
    Ninety-Nine 99 99.9990005493
  3. 次の例のパラメータは、構造体の配列を表します。

    SELECT echoStructArray(
        XMLELEMENT( 'inputStructArray',
            XMLATTRIBUTES( 'http://soapinterop.org/xsd' AS "xmlns:q2", 
                           'q2:SOAPStruct[2]' AS "SOAP-ENC:arrayType" ),
                ( 
                SELECT XMLAGG( 
                    XMLElement('q2:SOAPStruct',
                    XMLFOREST( s as varString,
                               i as varInt,
                               f as varFloat )
                    ) 
                ORDER BY seqno
                ) 
            FROM SoapData 
            ) 
        )
    );

    ストアド・プロシージャ echoFloatArray は、次の XML を相互運用サーバに送信します。

    <inputStructArray xmlns:q2="http://soapinterop.org/xsd"
      SOAP-ENC:arrayType="q2:SOAPStruct[2]">
      <q2:SOAPStruct>
        <varString>Ninety-Nine</varString>
        <varInt>99</varInt>
        <varFloat>99.9990005493164</varFloat>
      </q2:SOAPStruct>
      <q2:SOAPStruct>
        <varString>Hundred and Ninety-Nine</varString>
        <varInt>199</varInt>
        <varFloat>199.998992919922</varFloat>
      </q2:SOAPStruct>
    </inputStructArray>

    相互運用サーバからの応答は次のようになります。

    '<?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <SOAP-ENV:Envelope
      xmlns:SOAPSDK1="http://www.w3.org/2001/XMLSchema"
      xmlns:SOAPSDK2="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:SOAPSDK3="http://schemas.xmlsoap.org/soap/encoding/"
      xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
      <SOAP-ENV:Body
        SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
        <SOAPSDK4:echoStructArrayResponse
          xmlns:SOAPSDK4="http://soapinterop.org/">
          <Result xmlns:SOAPSDK5="http://soapinterop.org/xsd"
            SOAPSDK3:arrayType="SOAPSDK5:SOAPStruct[2]"
            SOAPSDK3:offset="[0]" SOAPSDK2:type="SOAPSDK3:Array">
            <SOAPSDK5:SOAPStruct href="#id1"/>
            <SOAPSDK5:SOAPStruct href="#id2"/>
          </Result>
        </SOAPSDK4:echoStructArrayResponse>
        <SOAPSDK6:SOAPStruct
          xmlns:SOAPSDK6="http://soapinterop.org/xsd"
          id="id1"
          SOAPSDK3:root="0"
          SOAPSDK2:type="SOAPSDK6:SOAPStruct">
          <varString>Ninety-Nine</varString>
          <varInt>99</varInt>
          <varFloat>99.9990005493164</varFloat>
        </SOAPSDK6:SOAPStruct>
        <SOAPSDK7:SOAPStruct
          xmlns:SOAPSDK7="http://soapinterop.org/xsd"
          id="id2"
          SOAPSDK3:root="0"
          SOAPSDK2:type="SOAPSDK7:SOAPStruct">
          <varString>Hundred and Ninety-Nine</varString>
          <varInt>199</varInt>
          <varFloat>199.998992919922</varFloat>
        </SOAPSDK7:SOAPStruct>
      </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>'

    応答が変数に格納された場合は、OPENXML を使用して解析できます。

    SELECT * FROM openxml( resp,'//*:Body/*:SOAPStruct' ) 
    WITH (
    varString LONG VARCHAR 'varString',
    varInt INT 'varInt',
    varFloat FLOAT 'varFloat' );
    varString varInt varFloat
    Ninety-Nine 99 99.9990005493
    Hundred and Ninety-Nine 199 199.9989929199