4.10 DRDAデータ型からOracleデータ型への変換
アプリケーションとデータベース間でデータを移動する場合、ゲートウェイでは、特定のデータ型のホスト変数またはリテラルのデータ値を、データベースで認識されるデータ型にバインドします。
したがって、ゲートウェイでは、任意のバージョンのDRDAサーバーの値を適切なOracleデータ型にマップしてから、それらの値をアプリケーションまたはOracleツールに戻します。
「表4-4」は、データ型のマッピングおよび制限を示します。 表にリストされたDRDAサーバーのデータ型は、一般的なものです。 データ型のサイズおよび値の制限の詳細は、使用しているDRDAデータベースのドキュメントを参照してください。
表4-4 データ型のマッピングと制限
DRDAサーバー | Oracle外部データ型 | 基準 | Oracleが大きなvarchar (32k)を使用する場合 |
---|---|---|---|
|
|
|
- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
「日付および時刻操作の実行」 を参照 |
- |
|
|
「日付および時刻操作の実行」 を参照 |
- |
|
|
「日付および時刻操作の実行」 を参照 |
- |
|
|
|
- |
|
|
|
|
|
|
|
|
|
|
該当なし |
- |
|
|
該当なし |
- |
|
|
該当なし |
- |
|
|
該当なし |
- |
|
|
該当なし |
- |
|
|
該当なし |
- |
|
|
該当なし |
- |
|
|
該当なし |
- |
- 「文字列操作の実行」
ゲートウェイは、参照される列のデータ型を使用してすべての文字列比較、連結およびソートを実行し、ゲートウェイを使用してアプリケーションによって渡される文字列値の妥当性を判断します。 - 「文字列データ型の変換」
ゲートウェイは、ホスト変数の文字列データ値を固定長文字列としてバインドします。 - 「グラフィック文字列操作の実行」
DB2GRAPHIC
データ型は、ダブルバイトの文字列データのみを格納します。 - 「日時操作の実行」
日付と時間データの実装は、IBM DRDAデータベースとOracleデータベースで大きく異なります。 - 「日付」
このトピックでは、日付処理について説明します。 - 「NLS_DATE_FORMATサポート」
この表は、ALTER SESSION SET NLS_DATE_FORMAT
のNLS_DATE_FORMAT
に使用できる4つのパターンを示しています。 - 「Oracle TO_DATE関数」
OracleTO_DATE
関数は、SQLINSERT
,UPDATE
,DELETE
句およびSELECT
WHERE
句で事前処理されます。SELECT
結果リストのTO_DATE
関数は、前処理されません。 - 「数値データ型操作の実行」
IBMバージョンのDRDAサーバーでは、宛先列の数値データ型(整数、倍精度浮動小数点、10進数など)への自動変換が実行されます。 - 「COUNT関数のマッピング」
このトピックでは、COUNT
関数のマッピングについて説明します。 - 「ゾーン小数演算の実行」
ゾーン化された10進フィールドは、Oracleデータベースでパックされた10進数として記述されます。
親トピック: アプリケーションの開発
4.10.1 文字列操作の実行
ゲートウェイでは、参照列のデータ型を使用してすべての文字列の比較、連結およびソートを実行し、ゲートウェイを使用するアプリケーションにより渡された文字列値の有効性を決定します。
ゲートウェイでは、1つのデータ型から別のデータ型に文字列が自動的に変換され、必要に応じて文字列と日付間の変換が行われます。
DRDAデータベースが文字列に文字以外のバイナリ・データを保持するよう設計されていることはよくあります。 DRDAシステムで実行されるアプリケーションは、通常、文字データが含まれる場合と同じようにデータを格納および検索できます。 ただし、このデータにアクセスするアプリケーションが、異なる文字セットを使用する環境で実行されると、不正確なデータが戻される可能性があります。
ホストで実行されているゲートウェイでは、DB2 UDB for iSeriesまたはz/OSホストのDB2 UDBから取得された文字データは、EBCDICからASCIIに変換されます。 文字データがホストからDB2 UDB for iSeriesまたはz/OSのDB2 UDBに送信されると、ASCIIデータはEBCDICに変換されます。 文字が文字列内のバイナリ・データである場合、この変換により、アプリケーションでは間違った情報またはエラーが取得されます。 これらのエラーを解決するには、DB2 UDB for iSeriesまたは非文字データを保持するz/OSのDB2 UDBの文字列をFOR BIT DATA
オプションを使用して作成する必要があります。 アプリケーションでは、非文字データを保持する文字列は、Oracleデータ型RAW
およびLONG RAW
を使用して処理する必要があります。 ホストでFOR BIT DATA
を使用して定義された文字列のDESCRIBE
情報は、常にRAW
またはLONG RAW
を示します。
親トピック: DRDAデータ型からOracleデータ型への変換
4.10.2 文字列データ型の変換
ゲートウェイでは、ホスト変数の文字列のデータ値を固定長の文字列としてバインドします。
バインド長は、文字列のデータ値の長さです。 ゲートウェイでは、この変換をバインドごとに実行します。
DRDA VARCHAR
データ型は、32767
の最大VARCHAR2
サイズを使用するようにOracleデータベースが構成されている場合、1
文字から32767
文字までの長さにすることができます。 それ以外の場合、制限は4000
です。 DRDA VARCHAR
データ型がOracleで構成されたVARCHAR2
制限サイズより大きい場合、Oracle LONG
データ型に変換されます。
DB2 VARCHAR
データ型は、32767
バイトを超えることはできません。これは、Oracle LONG
データ型の最大サイズよりはるかに短いです。 長さが32767
バイトを超えるOracle LONG
データ型を定義すると、DB2 VARCHAR
データ型にマップされるときにエラー・メッセージが表示されます。
親トピック: DRDAデータ型からOracleデータ型への変換
4.10.3 GRAPHIC文字列操作の実行
DB2 GRAPHIC
データ型は、ダブルバイトの文字列データのみを格納します。
DB2 GRAPHIC
データ型のサイズは通常、対応する文字の半分の最大サイズを持ちます。 たとえば、CHAR
の最大サイズは255文字ですが、GRAPHIC
の最大サイズは127文字です。
Oracle Databaseには直接一致するデータ型がないため、ゲートウェイではOracleの文字データ型とDB2のGRAPHICデータ型間で変換が行われます。 Oracle Databaseの文字データ型には、シングルバイト、混合バイトまたはダブルバイトの文字データを含めることができます。 ゲートウェイは、ターゲットのDB2列がGraphic
型であるかどうか、およびゲートウェイ初期化パラメータがこの変換を実行するように設定されているかどうかに応じて、文字列データを適切なダブルバイトのみの形式に変換します。 構成の詳細は、「初期化パラメータ」を参照してください。
親トピック: DRDAデータ型からOracleデータ型への変換
4.10.4 日付および時刻操作の実行
日付および時刻データの実装は、IBM DRDAデータベースとOracle Databaseでは大きく異なります。
Oracleデータベースには、カレンダ日時情報の両方を含むことができる単一の日付データ型DATE
があります。
IBM DRDAデータベースでは、次の3つの異なる日付および時刻のデータ型がサポートされます。
DATE
はカレンダ日付のみです。
TIME
は、時間のみです。
TIMESTAMP
は、カレンダ日時とIBM DRDAデータベースの内部形式のマイクロ秒解像度を組み合せた数値です。
- 「TIMEおよびTIMESTAMPデータの処理」
IBMTIME
およびTIMESTAMP
データをOracleDATE
データに変換する組込みメカニズムはありません。 - 「DATEデータの処理」
OracleとIBMのDATE
データ型は、相互にマッピングされます。 - 「実行日算術」
このトピックでは、Oracle Database Gateway for DRDAでの日付算術の使用について説明します。
親トピック: DRDAデータ型からOracleデータ型への変換
4.10.4.1 TIMEおよびTIMESTAMPデータの処理
IBM TIME
およびTIMESTAMP
データをOracle DATE
データに変換する組込みメカニズムはありません。
アプリケーションは、長さが8バイトのTIME
データ型をOracle CHAR
形式に処理する必要があります。 アプリケーションは、長さが26バイトのTIMESTAMP
データ型をOracle CHAR
形式で処理する必要があります。
アプリケーションは、文字列としてTIME
関数およびTIMESTAMP
関数を読み取り、数値演算を実行するために文字列の一部を変換またはサブセット化します。 TIME
およびTIMESTAMP
値は、適切な長さおよび書式の文字リテラルまたはバインド変数としてDRDAサーバーに送信できます。
親トピック: 日時操作の実行
4.10.4.2 DATEデータの処理
OracleとIBMのDATE
データ型は、相互にマッピングされます。
IBM DATE
を問い合せると、ゼロ(午前0時)の時間でOracle DATE
に変換されます。 Oracle DATE
がIBM DATE
列に対して処理される場合、日付値はIBM DATE
形式に変換され、時間値はすべて破棄されます。
日付の文字表現は、Oracle形式とIBM DRDA形式で異なります。 OracleアプリケーションのSQL文が日付リテラルを含む場合、または文字バインド変数を使用して日付を転送する場合、ゲートウェイでは、その日付をIBM DRDA互換形式に変換する必要があります。
ゲートウェイは、IBM DATE
列に対して文字値が処理されるタイミングを自動的に認識しません。 アプリケーションは、文字の日付値をOracle TO_DATE
関数表記法で囲んで区別するために必要です。 たとえば、 EMP
がIBM DRDAデータベースのデータにアクセスするシノニムまたはビューである場合は、次のSQL文を使用しないでください:
SELECT * FROM EMP WHERE HIREDATE = '03-MAR-81'
次のものを使用する必要があります:
SELECT * FROM EMP WHERE HIREDATE = TO_DATE('03-MAR-81')
適切な日付値用の文字バインド変数を使用するプログラム的インタフェースを持つプログラムの場合、次のSQL文を使用する必要があります。
SELECT * FROM EMP WHERE HIREDATE = TO_DATE(:1)
文がOracle Database表に対して実行される場合、前述のSQL表記法は、SQL文のセマンティクスに影響しません。 文は、引き続きOracleおよびIBM DRDAのアクセス対象データ・ストア間で移植可能です。
挿入値以外の日付リテラルは、処理のためにDB2に送信する前に、Oracle NLS_DATE_FORMAT
と一致するようにチェックされます。 TG4DB2 v10.2は、NLS_DATE_FORMAT
形式と一致するかどうかをチェックしません。 このような互換性が必要な場合は、HS_FDS_CAPABILITY
パラメータの一部としてNODATECHK/ON
値を指定する必要があります。 その後、任意のDB2許容日付書式を使用できます:
YYYY-MM-DD
(ISO/JIS)DD.MM.YYYY
(European)MM/DD/YYYY
(USA)
たとえば:
SELECT * FROM EMP WHERE HIREDATE = '1981-03-03'
TO_DATE
要件は、Oracle日付7バイトのバイナリ形式の入力バインド変数にも関連しません。 これらの値は、ゲートウェイで日付として認識されます。 z/OS用のDB2 UDBの場合、ゲートウェイ付属のDATE EXIT
をインストールすると、2つの追加のOracle日付書式を使用することもできます: DD-MON-RRおよびDD-MON-YYYY
親トピック: 日時操作の実行
4.10.4.3 日付の計算の実行
このトピックでは、Oracle Database Gateway for DRDAでの日付算術の使用について説明します。
一般的に、次の形式のSQL式は、ゲートウェイで正しく動作しません。
date + number number + date date - number date1 - date2
日付と数値の加算および減算の (date + number,number + date,date - number)
フォームは、DRDAサーバーに送信され、そこで拒否されます。 サポート対象のサーバーでは、日付に対する数値の加算または減算は許可されません。
サポートされているサーバーで日付の減算の解釈が異なるため、2つの日付を減算すると、 (date1 - date2)
はサーバーによって異なる結果になります。
ノート:
日付の計算に関する問題が解決されるまで、すべてのゲートウェイSQLで日付の計算式を使用しないでください。親トピック: 日時操作の実行
4.10.5 日付
このトピックでは、日付処理について説明します。
日付処理には次の2つのカテゴリがあります。
- 2桁の年日付。2000年を基準としてその前後50年として処理されます。
- 4桁の年日付。2000年に関するあいまいさは存在しません。
次のいずれかの方法を使用して21世紀の日付を入力してください。
TO_DATE
関数4文字の年フィールドを含む任意の日付書式を使用します。 使用可能な日付書式文字列オプションについては、「Oracle Database SQL言語リファレンス」を参照してください。
たとえば、
TO_DATE
('2008-07-23', 'YYYY-MM-DD
')は、任意のSELECT
,INSERT
,UPDATE
文またはDELETE
文で使用できます。NLS_DATE_FORMAT
パラメータALTER SESSION SET NLS_DATE_FORMAT
は、SQLで使用される日付書式を設定するために使用します。
親トピック: DRDAデータ型からOracleデータ型への変換
4.10.6 NLS_DATE_FORMATサポート
この表は、ALTER SESSION SET NLS_DATE_FORMAT
のNLS_DATE_FORMAT
に使用できる4つのパターンを示しています。
たとえば:
DB2の日付書式 | パターン | 例 |
---|---|---|
EUR |
DD.MM.YYYY |
30.10.1994 |
ISO |
YYYY-MM-DD |
1994-10-30 |
JIS |
YYYY-MM-DD |
1994-10-30 |
USA |
月/日/年 |
10/30/1994 |
Oracleデータベースのデフォルト形式'DD-MON-YY
'は、DB2では許可されません。
次に、21世紀の日付値を入力および選択する方法の例を示します。
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD'; INSERT INTO EMP (HIREDATE) VALUES ('2008-07-23'); SELECT * FROM EMP WHERE HIREDATE = '2008-07-23'; UPDATE EMP SET HIREDATE = '2008-07-24' WHERE HIREDATE = '2008-07-23'; DELETE FROM EMP WHERE HIREDATE = '2008-07-24';
親トピック: DRDAデータ型からOracleデータ型への変換
4.10.7 Oracle TO_DATE関数
Oracle TO_DATE
関数は、SQL INSERT
, UPDATE
, DELETE
句およびSELECT
WHERE
句で事前処理されます。 SELECT
結果リストのTO_DATE
関数は、前処理されません。
多くの場合、TO_DATE
関数は、日付列を更新または比較する値を指定するために必要です。 したがって、ゲートウェイは、SQL文がDB2に送信される前に、TO_DATE
句に含まれる情報を許容値に置き換えます。
SELECT
結果リストを除き、すべてのTO_DATE
関数が事前処理され、TO_DATE
関数の結果となる値になります。 TO_DATE
( literal
)またはTO_DATE
(:bind_variable)
のみが許可されます。 SELECT
結果リストを除き、TO_DATE
(column_name)
関数の形式はサポートされていません。
DB2ではVALUES
句内の関数は許可されないため、Oracle TO_DATE
関数の単純な値への前処理は、INSERT
VALUES
句で役立ちます。 この場合、DB2は、VALUES
リストの単純な値を受け取ります。 TO_DATE
関数のすべての形式(1、2または3つのオペランドを含む)がサポートされています。
親トピック: DRDAデータ型からOracleデータ型への変換
4.10.8 数値データ型操作の実行
DRDAサーバーのIBMバージョンでは、宛先列の数値データ型(整数、倍精度浮動小数点数または小数など)の自動変換が実行されます。
ユーザーにはこのデータ型変換を制御する方法はなく、この変換はデータベースの宛先列のデータ型とは無関係に発生します。
たとえば、 PRICE
がIBM DRDAデータベースの PRODUCT
表の整数列である場合、次の例に示す更新では、IBM DRDAサーバーは浮動小数点を整数に自動的に変換するため、アイスクリーム円錐の価格が$1.00に不正確に設定されます:
UPDATE PRODUCT SET PRICE = 1.50 WHERE PRODUCT_NAME = 'ICE CREAM CONE ';
PRICE
は整数であるため、IBM DRDAサーバーは1.50の10進データ値を1に自動的に変換します。
親トピック: DRDAデータ型からOracleデータ型への変換
4.10.9 COUNT関数のマッピング
このトピックでは、COUNT
関数のマッピングについて説明します。
Oracleデータベースでは、COUNT
関数に対して次の4つのオペランドがサポートされています:
COUNT(*)
COUNT(DISTINCT colname)
COUNT(ALL colname)
COUNT(colname)
一部のDRDAサーバーでは、COUNT
のすべての形式(特にCOUNT(colname)
およびCOUNT(ALL colname)
)がサポートされていません。 このような場合、COUNT
関数とその引数はCOUNT
(*)に変換されます。 これは、特にカウントされる列にNULL
が含まれている場合、目的の結果が得られないことがあります。
前述のフォームをサポートしていないDRDAサーバーでは、WHERE
句を追加することで同等の機能を実現できる場合があります。 たとえば、
SELECT COUNT(colname) FROM table@dblink WHERE colname
IS NOT NULL
または
SELECT COUNT(ALL colname) FROM table@dblink WHERE colname
IS NOT NULL
ネイティブ・セマンティクスを使用して、ゲートウェイ初期化ファイルの次のパラメータを使用して、すべてのCOUNT
関数のサポートを示すこともできます:
HS_FDS_CAPABILITY=(COUNTCOL=YES)
すべての形式のCOUNT
をサポートしていない既知のDRDAサーバーについては、「SQLの制限事項」を参照してください。
親トピック: DRDAデータ型からOracleデータ型への変換
4.10.10 ゾーン10進数操作の実行
ゾーン化された10進フィールドは、Oracleデータベースでパックされた10進数として記述されます。
ただし、Pro*CプログラムなどのOracleアプリケーションでは、サポートされる任意のOracle数値データ型を使用してゾーン10進数列に挿入できます。 ゲートウェイでは、この数値が最も適切なデータ型に変換されます。 情報の欠落が発生しないかぎり、データはDRDAデータベースから任意のOracleデータ型にフェッチできます。
親トピック: DRDAデータ型からOracleデータ型への変換