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 エンコードは String 型であり、SOAP サービス・フォーマットの結果セット出力には、結果セット内のカラムのデータ型について具体的に記述する情報がまったく含まれていません。すべてのフォーマットで、パラメータのデータ型は String です。DNET フォーマットの場合、応答のスキーマ・セクション内ですべてのカラムは String として型指定されています。CONCRETE フォーマットと XML フォーマットの場合は、応答にデータ型情報が含まれません。このデフォルトの動作は、DATATYPE 句を使用して操作できます。

SQL Anywhere では、DATATYPE 句を使用してデータ型指定を有効にします。データ型情報は、すべての SOAP サービス・フォーマットでパラメータ入力と結果セット出力 (応答) の XML エンコードに含めることができます。これにより、パラメータを String に明示的に変換するクライアント・コードが不要になるため、SOAP ツールキットからのパラメータ受け渡しが簡単になります。たとえば整数は int として渡すことができます。XML コード化されたデータ型では SOAP ツールキットを使用してデータを解析し、適切な型にキャストします。

String データ型を排他的に使用する場合、アプリケーションでは結果セット内の各カラムのデータ型を暗黙的にわかっている必要があります。データ型指定が Web サーバで要求される場合は、必要ありません。データ型情報が含まれるかどうかを制御するために、Web サービスの定義時に DATATYPE 句を使用できます。

DATATYPE { OFF | ON | IN | OUT }
  • OFF   DATATYPE オプションが使用されないときのデフォルトの動作です。DNET 出力フォーマットでは、SQL Anywhere データ型は XML スキーマの String 型との間で変換されます。CONCRETE フォーマットと XML フォーマットの場合は、データ型情報が生成されません。

  • ON   データ型情報は、入力パラメータと結果セットの応答の両方に対して生成されます。SQL Anywhere データ型は XML スキーマのデータ型との間で変換されます。

  • IN   データ型情報は、入力パラメータのみに対して生成されます。

  • OUT   データ型情報は、結果セット応答のみに対して生成されます。

結果セット応答にデータ型指定を含めるようにする Web サービス定義の例を次に示します。

CREATE SERVICE "SASoapTest/EmployeeList"
TYPE 'SOAP'
AUTHORIZATION OFF
SECURE OFF
USER DBA
DATATYPE OUT
AS SELECT * FROM Employees;

この例では、サービスにはパラメータがないため、データ型情報は結果セット応答のみに対して要求されます。

型指定は、「SOAP」型として定義されているすべての SQL Anywhere Web サービスに適用できます。

入力パラメータのデータ型指定

入力パラメータの型指定は、パラメータのデータ型を実際のデータ型として DISH サービスで生成される WSDL で公開するだけでサポートされます。

一般的な String パラメータ定義 (または型指定されていないパラメータ) は次のようになります。

<s:element minOccurs="0" maxOccurs="1" name="a_varchar" nillable="true" type="s:string" />

String パラメータは nil 可能な場合があります。つまり、出現することもしないこともあります。

整数などの型指定されたパラメータの場合、そのパラメータは出現する必要があり、nil 可能ではありません。次はその例です。

<s:element minOccurs="1" maxOccurs="1" name="an_int" nillable="false" type="s:int" />
出力パラメータのデータ型指定

「SOAP」型であるすべての SQL Anywhere Web サービスでは、応答データ内のデータ型情報を公開できます。データ型は、ローセット・カラム要素内の属性として公開されます。

SOAP FORMAT 'CONCRETE' Web サービスからの型指定された SimpleDataSet 応答の例を次に示します。

<SOAP-ENV:Body>
  <tns:test_types_concrete_onResponse>
   <tns:test_types_concrete_onResult xsi:type='tns:SimpleDataset'>
    <tns:rowset>
      <tns:row>
       <tns:lvc xsi:type="xsd:string">Hello World</tns:lvc>
       <tns:i xsi:type="xsd:int">99</tns:i>
       <tns:ii xsi:type="xsd:long">99999999</tns:ii>
       <tns:f xsi:type="xsd:float">3.25</tns:f>
       <tns:d xsi:type="xsd:double">.555555555555555582</tns:d>
       <tns:bin xsi:type="xsd:base64Binary">AAAAZg==</tns:bin>
       <tns:date xsi:type="xsd:date">2006-05-29-04:00</tns:date>
      </tns:row>
     </tns:rowset>
   </tns:test_types_concrete_onResult>
  <tns:sqlcode>0</tns:sqlcode>
  </tns:test_types_concrete_onResponse>
</SOAP-ENV:Body>

XML データを String として返す SOAP FORMAT 'XML' Web サービスからの応答の例を次に示します。内部ローセットは、コード化された XML で構成されます。ここでは、わかりやすいように復号化された形式で示されています。

<SOAP-ENV:Body>
 <tns:test_types_XML_onResponse>
  <tns:test_types_XML_onResult xsi:type='xsd:string'>
   <tns:rowset 
     xmlns:tns="http://localhost/satest/dish" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <tns:row>
     <tns:lvc xsi:type="xsd:string">Hello World</tns:lvc>
     <tns:i xsi:type="xsd:int">99</tns:i>
     <tns:ii xsi:type="xsd:long">99999999</tns:ii>
     <tns:f xsi:type="xsd:float">3.25</tns:f>
     <tns:d xsi:type="xsd:double">.555555555555555582</tns:d>
     <tns:bin xsi:type="xsd:base64Binary">AAAAZg==</tns:bin>
     <tns:date xsi:type="xsd:date">2006-05-29-04:00</tns:date>
    </tns:row>
   </tns:rowset>
  </tns:test_types_XML_onResult>
  <tns:sqlcode>0</tns:sqlcode>
 </tns:test_types_XML_onResponse>
</SOAP-ENV:Body>

要素のネームスペースと XML スキーマでは、データ型情報だけでなく、XML パーサによる後処理に必要なすべての情報を提供します。データ型情報が結果セットに存在しない場合 (DATATYPE OFF または IN)、xsi:type と XML スキーマのネームスペース宣言は省略されます。

型指定された SimpleDataSet を返す SOAP FORMAT 'DNET' Web サービスの例を次に示します。

<SOAP-ENV:Body>
  <tns:test_types_dnet_outResponse>
   <tns:test_types_dnet_outResult xsi:type='sqlresultstream:SqlRowSet'>
    <xsd:schema id='Schema2' 
       xmlns:xsd='http://www.w3.org/2001/XMLSchema' 
       xmlns:msdata='urn:schemas-microsoft.com:xml-msdata'>
     <xsd:element name='rowset' msdata:IsDataSet='true'>
      <xsd:complexType>
       <xsd:sequence>
        <xsd:element name='row' minOccurs='0' maxOccurs='unbounded'>
         <xsd:complexType>
          <xsd:sequence>
           <xsd:element name='lvc' minOccurs='0' type='xsd:string' />
           <xsd:element name='ub' minOccurs='0' type='xsd:unsignedByte' />
           <xsd:element name='s' minOccurs='0' type='xsd:short' />
           <xsd:element name='us' minOccurs='0' type='xsd:unsignedShort' />
           <xsd:element name='i' minOccurs='0' type='xsd:int' />
           <xsd:element name='ui' minOccurs='0' type='xsd:unsignedInt' />
           <xsd:element name='l' minOccurs='0' type='xsd:long' />
           <xsd:element name='ul' minOccurs='0' type='xsd:unsignedLong' />
           <xsd:element name='f' minOccurs='0' type='xsd:float' />
           <xsd:element name='d' minOccurs='0' type='xsd:double' />
           <xsd:element name='bin' minOccurs='0' type='xsd:base64Binary' />
           <xsd:element name='bool' minOccurs='0' type='xsd:boolean' />
           <xsd:element name='num' minOccurs='0' type='xsd:decimal' />
           <xsd:element name='dc' minOccurs='0' type='xsd:decimal' />
           <xsd:element name='date' minOccurs='0' type='xsd:date' />
          </xsd:sequence>
         </xsd:complexType>
        </xsd:element>
       </xsd:sequence>
      </xsd:complexType>
     </xsd:element>
    </xsd:schema>
    <diffgr:diffgram xmlns:msdata='urn:schemas-microsoft-com:xml-msdata' xmlns:diffgr='urn:schemas-microsoft-com:xml-diffgram-v1'>
     <rowset>
      <row>
       <lvc>Hello World</lvc>
       <ub>128</ub>
       <s>-99</s>
       <us>33000</us>
       <i>-2147483640</i>
       <ui>4294967295</ui>
       <l>-9223372036854775807</l>
       <ul>18446744073709551615</ul>
       <f>3.25</f>
       <d>.555555555555555582</d>
       <bin>QUJD</bin>
       <bool>1</bool>
       <num>123456.123457</num>
       <dc>-1.756000</dc>
       <date>2006-05-29-04:00</date>
      </row>
     </rowset>
    </diffgr:diffgram>
   </tns:test_types_dnet_outResult>
  <tns:sqlcode>0</tns:sqlcode>
  </tns:test_types_dnet_outResponse>
</SOAP-ENV:Body>
SQL Anywhere の型から XML スキーマの型へのマッピング
SQL Anywhere の型 XML スキーマの型 XML の例
CHAR string Hello World
VARCHAR string Hello World
LONG VARCHAR string Hello World
TEXT string Hello World
NCHAR string Hello World
NVARCHAR string Hello World
LONG NVARCHAR string Hello World
NTEXT string Hello World
UNIQUEIDENTIFIER string 12345678-1234-5678-9012-123456789012
UNIQUEIDENTIFIERSTR string 12345678-1234-5678-9012-123456789012
XML

これはユーザ定義の型です。パラメータは、複合型 (base64Binary、SOAP 配列、struct など) を表す有効な XML であることが想定されます。

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

(「ABC」と解釈される)

BIGINT long -9223372036854775807
UNSIGNED BIGINT unsignedLong 18446744073709551615
BIT boolean 1
VARBIT string 11111111
LONG VARBIT string 00000000000000001000000000000000
DECIMAL decimal -1.756000
DOUBLE double .555555555555555582
FLOAT float 12.3456792831420898
INTEGER int -2147483640
UNSIGNED INTEGER unsignedInt 4294967295
NUMERIC decimal 123456.123457
REAL float 3.25
SMALLINT short -99
UNSIGNED SMALLINT unsignedShort 33000
TINYINT unsignedByte 128
MONEY decimal 12345678.9900
SMALLMONEY decimal 12.3400
DATE date 2006-11-21-05:00
DATETIME dateTime 2006-05-21T09:00:00.000-08:00
SMALLDATETIME dateTime 2007-01-15T09:00:00.000-08:00
TIME time 14:14:48.980-05:00
TIMESTAMP dateTime 2007-01-12T21:02:14.420-06:00
BINARY base64Binary AAAAZg==
IMAGE base64Binary AAAAZg==
LONG BINARY base64Binary AAAAZg==
VARBINARY base64Binary AAAAZg==

1 つまたは複数のパラメータが NCHAR、NVARCHAR、LONG NVARCHAR、NTEXT のいずれかの型の場合、応答は UTF8 で出力されます。クライアント・データベースが UTF-8 文字コードを使用している場合は動作に変更はありません (NCHAR と CHAR のデータ型は同一であるため)。ただし、データベースが UTF-8 文字コードを使用していない場合は、NCHAR 以外のデータ型のパラメータはすべて UTF8 に変換されます。XML 宣言エンコードおよび HTTP ヘッダ Content-Type の値は、使用される文字コードに対応します。

XML スキーマの型から Java の型へのマッピング
XML スキーマの型 Java データ型
xsd:string java.lang.String
xsd:integer java.math.BigInteger
xsd:int int
xsd:long long
xsd:short short
xsd:decimal java.math.BigDecimal
xsd:float float
xsd:double double
xsd:boolean boolean
xsd:byte byte
xsd:QName javax.xml.namespace.QName
xsd:dateTime javax.xml.datatype.XMLGregorianCalendar
xsd:base64Binary byte[]
xsd:hexBinary byte[]
xsd:unsignedInt long
xsd:unsignedShort int
xsd:unsignedByte short
xsd:time javax.xml.datatype.XMLGregorianCalendar
xsd:date javax.xml.datatype.XMLGregorianCalendar
xsd:g javax.xml.datatype.XMLGregorianCalendar
xsd:anySimpleType java.lang.Object
xsd:anySimpleType java.lang.String
xsd:duration javax.xml.datatype.Duration
xsd:NOTATION javax.xml.namespace.QName