データ型

Virtual DataPort カタログには、事前定義されたデータ型のグループが含まれています。これらの型は、基本型と複合型の 2 つのグループに大別できます。

Virtual DataPort のデータ型
<Virtual DataPort data type> ::=
      blob
    | boolean
    | date
    | decimal
    | double
    | float
    | int
    | intervaldaysecond
    | intervalyearmonth
    | localdate
    | long
    | text
    | time
    | timestamp
    | timestamptz
    | xml
    | <Virtual DataPort compound data type>

<Virtual DataPort compound data type> ::=
      array
    | register

サポートされている基本データ型は、以下のとおりです。

  • int: 整数。最大値は +2^31-1 (2,147,483,647)、最小値は -2^31 (-2,147,483,648) です。

  • long: Long 型整数。最大値は 2 63 - 1 (9,223,372,036,854,775,807)、最小値は -2 63 (-9,223,372,036,854,775,808) です。

  • float: 単精度 32 ビット IEEE 754 浮動小数点数。値の範囲については、Java 言語仕様の「 浮動小数点型、フォーマット、および値 」を参照してください。

  • double: 倍精度 64 ビット IEEE 754 浮動小数点数。値の範囲については、Java 言語仕様の「 浮動小数点型、フォーマット、および値 」を参照してください。

  • decimal: 任意精度の符号付き 10 進数。

  • boolean: true、false、unknown (null) のいずれかをとる論理値。

  • text: 文字列。

  • date (非推奨): タイムゾーン変換されるタイムスタンプ。互換性のために維持されています。

  • localdate: タイムゾーンなしの日付 (年、月、日)。

  • time: タイムゾーンなしの時間 (時、分、秒、ミリ秒)。

  • timestamp: タイムゾーンなしのタイムスタンプ (年、月、日、時、分、秒、ミリ秒)。

  • timestamptz: タイムゾーン変換されるタイムスタンプ。

  • intervaldaysecond: YEAR または MONTH 以外の連続フィールドのうち、任意のセットを含む精度で表される継続期間。

  • intervalyearmonth: YEAR フィールドと MONTH フィールドの両方または一方を含む精度で表される継続期間。

  • blob: バイナリ値。この値をクエリ条件に加えることはできません。

  • xml: XML ドキュメントまたは XML フラグメント。

日時型

日時型については、次の「 日付、タイムスタンプ、間隔のデータ型 」で詳しく説明します。

複合型

Virtual DataPort では、SOAP Web サービスや XML ドキュメントなどから取得した階層データをモデル化するために複合データ型を定義することができます。複合型の定義方法については、「 データ型の定義 」で詳しく説明します。

複合データ型は以下のとおりです。

  • register: 異種混合型の内部構造を備えた複合データ。つまり、データがさらに細かいフィールドに分かれたもので、その型はすべて異なります。

  • array: 同じ register 型のエレメントのリスト。

数値型

数値型 int にはオーバーフロー保護はありません。そのため、2 つの int 値を伴う算術演算は、演算結果がデータ型の範囲を超える場合に誤った値を返します。このデータ型の範囲は -2,147,483,648 ~ 2,147,483,647 です。 int 値に対して算術演算を適用する際に、演算の結果がその範囲を超える可能性がある場合は、演算の入力値を long または decimal に変換することを検討してください。

たとえば、以下のクエリはかなり高い確率で無効な値を返します。

SELECT amount_in_millions * 1000000 AS amount

この問題を避けるために、列 amount_in_millionslong に変換します。

SELECT cast('long', amount_in_millions) * 1000000 AS amount

演算の入力値 (amount_in_millions) にキャストを適用する必要がある点に注意してください。乗算の結果をキャストしても問題は解決されません。

decimal は、任意精度であるため、この影響を受けません (つまり、精度に制限がありません)。

データ型 longfloatdouble のいずれにもオーバーフロー保護はありません。ただし、その範囲ははるかに広いため、範囲を超えることは滅多にありません。