使用函数或过程将 SQL Anywhere 服务器作为 Web 服务客户端与 Web 服务连接。
对于简单的返回数据类型,结果集内的字符串表示形式就足够了。在这种情况下,可能有必要使用存储过程。
当返回复杂的数据(如数组或结构)时,使用 Web 服务函数是较好的选择。对于函数声明,RETURN 子句可指定 XML 数据类型。可使用 OPENXML 对返回的 XML 进行分析以抽取有用的元素。
请注意,返回的 XML 数据(如 dateTime)将在结果集内逐字显示。例如,如果结果集内包括 TIMESTAMP 列,它的格式将为 XML dateTime 字符串 (2006-12-25T12:00:00.000-05:00) 而非字符串 (2006-12-25 12:00:00.000)。
支持将 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 服务客户端函数。Web 服务函数将分别与名为 echoFloatArray、echoStruct 和 echoStructArray 的 SOAP 操作(或 RPC 函数名称)进行通信。用于互操作性测试的公共命名空间为 http://soapinterop.org/,这样,只需将 URL 子句更改为所选的 SOAP 端点,给定函数便可针对替代互操作性服务器进行测试。
该示例旨在向 Microsoft SOAP ToolKit 3.0 Round 2 互操作性测试服务器 ( http://mssoapinterop.org/stkV3) 发布请求。
所有示例都使用一个表来生成 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'); |
以下三个函数将 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/'; |
最终将显示三个示例语句及其参数的 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="yes"?> <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="yes"?> <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="yes"?> <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 |
![]() |
使用DocCommentXchange 讨论此页。
|
版权 © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |