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) のようにフォーマットされます。
SQL Anywhere XML データ型は、Web サービス関数とプロシージャ内のパラメータとして使用できます。単純な型の場合、SOAP 要求の本文が生成されるときに、パラメータ要素が自動的に構成されます。しかし、XML 型のパラメータの場合、要素の XML 表現で追加のデータを提供する属性が必要になることがあるため、自動的に構成できません。そのため、データ型が XML のパラメータに対して XML を生成するときは、ルート要素の名前をパラメータ名と一致させる必要があります。
<inputHexBinary xsi:type="xsd:hexBinary">414243</inputHexBinary> |
この XML 型は、パラメータを hexBinary XML 型として送信する方法の例を示しています。SOAP 終了ポイントは、パラメータ名 (XML 用語ではルート要素名) が inputHexBinary であることを想定しています。
複雑な構造体や配列を構築するには、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 相互運用性テスト・サーバ
( 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 表現で表されています。
次の例のパラメータは、配列を表します。
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 |
次の例のパラメータは、構造体を表します。
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 |
次の例のパラメータは、構造体の配列を表します。
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 |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |