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

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - Programmierung » SQL Anywhere Datenzugriff-APIs » SQL Anywhere-Webdienste

 

Mit strukturierten Datentypen arbeiten

XML-Rückgabewerte

Der SQL Anywhere-Server als Webdienstclient kann sich mit einer Funktion oder Prozedur mit einem Webdienst verbinden.

Für einfache Rückgabe-Datentypen ist möglicherweise eine Zeichenfolgendarstellung innerhalb einer Ergebnismenge ausreichend. In diesem Fall kann die Verwendung einer gespeicherten Prozedur geeignet sein.

Für die Rückgabe komplexer Daten wie etwa Arrays oder Strukturen ist der Einsatz von Webdienstfunktionen vorzuziehen. Bei Funktionsdeklarationen kann die RETURN-Klausel einen XML-Datentyp angeben. Der zurückgegebene XML-Code kann mit OPENXML analysiert werden, um die gewünschten Elemente zu extrahieren.

Beachten Sie, dass die Rückgabe von XML-Daten wie etwa dateTime innerhalb der Ergebnismenge wortgetreu erfolgt. Falls beispielsweise eine TIMESTAMP-Spalte in einer Ergebnismenge enthalten ist, wird sie als XML-Zeichenfolge des Typs dateTime formatiert (2006-12-25T12:00:00.000-05:00), nicht als Zeichenfolge (2006-12-25 12:00:00.000).

XML-Parameterwerte

Der SQL Anywhere XML-Datentyp wird für die Verwendung als Parameter innerhalb von Webdienstfunktionen und -prozeduren unterstützt. Für einfache Typen wird das Parameterelement automatisch erstellt, wenn der Hauptteil für die SOAP-Anforderung generiert wird. Für Parameter des Typs XML kann dies jedoch nicht durchgeführt werden, da die XML-Darstellung des Elements möglicherweise Attribute benötigt, die zusätzliche Daten bereitstellen. Daher muss der Name des Stammelements dem Parameternamen entsprechen, wenn XML für einen Parameter generiert wird, dessen Datentyp XML ist.

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

Der XML-Typ zeigt, wie ein Parameter als XML-Typ hexBinary gesendet wird. Der SOAP-Endpunkt erwartet, dass der Parametername (oder in der XML-Terminologie der Stammelementname) inputHexBinary ist.

Namespace-Deklarationen

Um komplexe Strukturen und Arrays zu erstellen, sind Kenntnisse der SQL Anywhere-Referenz-Namespaces erforderlich. Die hier aufgeführten Präfixe entsprechen den Namespace-Deklarationen, die für einen SQL Anywhere SOAP-Anforderungsrahmen generiert wurden.

SQL Anywhere XML-Präfix Namespace
xsd http://www.w3.org/2001/XMLSchema
xsi http://www.w3.org/2001/XMLSchema-Instanz
SOAP-ENC http://schemas.xmlsoap.org/soap/encoding/
m Namespace, wie in der NAMESPACE-Klausel definiert
Beispiele komplexer Datentypen

Mit den folgenden drei Beispielen wird gezeigt, wie Webdienstclientfunktionen mit Parametern erstellt werden, die ein Array, eine Struktur und ein Array von Strukturen darstellen. Diese Beispiele wurden erstellt, um Anforderungen an den SOAP ToolKit 3.0 Round 2-Systemoffenheits-Testserver von Microsoft ([external link] http://mssoapinterop.org/stkV3) zu stellen. Die Webdienstfunktionen kommunizieren mit den SOAP-Operationen (oder RPC-Funktionsnamen) echoFloatArray, echoStruct und echoStructArray. Der gemeinsame Namespace für Systemoffenheitstests ist http://soapinterop.org/. Er macht es möglich, eine bestimmte Funktion mit alternativen Systemoffenheitsservern zu testen, indem einfach die URL-Klausel auf den ausgewählten SOAP-Endpunkt geändert wird.

Alle drei Beispiele verwenden eine Tabelle zum Generieren der XML-Daten. Im folgenden Abschnitt wird gezeigt, wie diese Tabelle eingerichtet wird.

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');

Die folgenden drei Funktionen senden SOAP-Anforderungen an den Systemoffenheitsserver. Beachten Sie, dass dieses Beispiel Anforderungen an den Microsoft Soap Interop Server sendet:

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/';

Abschließend werden die drei Beispielanweisungen zusammen mit der XML-Darstellung ihrer Parameter gezeigt:

  1. Die Parameter im folgenden Beispiel stellen ein Array dar.

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

    Die gespeicherte Prozedur echoFloatArray sendet den folgenden XML-Code an den Systemoffenheitsserver.

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

    Der Systemoffenheitsserver liefert folgende Antwort.

    '<?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>'

    Falls die Anwort in einer Variablen gespeichert wurde, kann sie mit OPENXML analysiert werden.

    SELECT * FROM openxml( resp,'//*:Result/*' ) 
    WITH ( varFloat FLOAT 'text()' );
    varFloat
    99.9990005493
    199.9989929199
  2. Die Parameter im folgenden Beispiel stellen eine Struktur dar.

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

    Die gespeicherte Prozedur echoStruct sendet den folgenden XML-Code an den Systemoffenheitsserver.

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

    Der Systemoffenheitsserver liefert folgende Antwort.

    '<?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>'

    Falls die Anwort in einer Variablen gespeichert wurde, kann sie mit OPENXML analysiert werden.

    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. Die Parameter im folgenden Beispiel stellen ein Array von Strukturen dar.

    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 
            ) 
        )
    );

    Die gespeicherte Prozedur echoFloatArray sendet den folgenden XML-Code an den Systemoffenheitsserver.

    <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>

    Der Systemoffenheitsserver liefert folgende Antwort.

    '<?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>'

    Falls die Anwort in einer Variablen gespeichert wurde, kann sie mit OPENXML analysiert werden.

    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