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 返回值

使用函数或过程将 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)。

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 服务客户端函数。该示例旨在向 Microsoft SOAP ToolKit 3.0 Round 2 互操作性测试服务器 ([external link] http://mssoapinterop.org/stkV3) 发布请求。Web 服务函数将分别与名为 echoFloatArray、echoStruct 和 echoStructArray 的 SOAP 操作(或 RPC 函数名称)进行通信。用于互操作性测试的公共命名空间为 "http://soapinterop.org/",这样,只需将 URL 子句更改为所选的 SOAP 端点,给定函数便可针对替代互操作性服务器进行测试。

所有三个示例都使用一个表来生成 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 表示形式:

  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