HCOPG を使用すると、PIC X 文字ホスト変数の DATE、TIME、および TIMESTAMP の形式など、メインフレーム DB2 の日時データ型の形式をそのまま維持し、それらのデータ型に対する PostgreSQL のデフォルトの形式を使用せずに PostgreSQL の対応する date、time、および timestamp の列にアクセスできます。PostgreSQL の文字列に、データをメインフレーム DB2 の形式のまま格納することもできます。
ほとんどのメインフレーム DB2 アプリケーションが DB2 DATE、TIME、および TIMESTAMP PIC X 文字ホスト変数のデフォルト形式を使用しますが、一部は使用しません。メインフレーム DB2 アプリケーションは、デフォルトに加えて代替形式もサポートします。同様に、ほとんどの PostgreSQL アプリケーションは、PIC X 文字ホスト変数のデフォルトの date、time、および timestamp の形式を使用します。残念ながら、DB2 のデフォルトのデータ型形式は PostgreSQL のデフォルトのデータ型形式と一致しません。メインフレーム DB2 の DATE、TIME、および TIMESTAMP の形式が正しく変換され、PostgreSQL のアプリケーションによって認識されることを確認するには、HCOPG を使用して変換をカスタマイズします。
たとえば、文字ホスト変数のデフォルトのデータ型形式は、次のとおりです。
| メインフレーム データ型 | メインフレーム DB2 形式 | PostgreSQL データ型 | PostgreSQL 形式 |
|---|---|---|---|
| DATE | yyyy-mm-dd | date | yyyy-mm-dd |
| TIME | hh.mm.ss | time | hh:mm:ss |
| TIMESTAMP | yyyy-mm-dd-hh.mm.ss.ffffff | timestamp | yyyy-mm-dd hh:mm:ss.ffffffff |
メインフレーム DB2 の DATE データ型と PostgreSQL の date データ型については、文字ホスト変数のデフォルトの形式が一致しています。したがって、PostgreSQL で DB2 の形式が認識され、変換は必要ありません。ただし、TIME/time および TIMESTAMP/timestamp のデフォルトのデータ型形式は一致しません。そのため、アプリケーションで文字ホスト変数に DB2 のデフォルトの TIME 形式または TIMESTAMP 形式 (あるいはその両方) を使用し、それらを SQL Server の time および timestamp のデータ型に使用する場合は、それらが PostgreSQL で認識されるように HCOSS を使用してメインフレーム DB2 の形式を変換します。
変換する DB2 アプリケーションで PostgreSQL ではデフォルトでサポートされていない入力ホスト変数形式を使用している場合は、DETECTDATE HCOPG コンパイラ指令オプションを使用して DB2 形式を PostgreSQL 互換形式に変換します。DETECTDATE は、HCOPG に PostgreSQL の文字入力ホスト変数の内容を調べるように指示し、DATE、TIME、および TIMESTAMP データ用に指定されたメインフレーム形式に一致するデータを探します。
日付と時間の変換に対処するために DETECTDATE 指令のみを使用して処理された DATE および TIME データ型に関しては、HCOPG は PostgreSQL 文字入力ホスト変数の内容を調査し、デフォルトの DATE および TIME DB2 メインフレーム形式 (それぞれ yyyy-mm-dd と hh.mm.ss) に基づいて一致するフィールドを識別します。
DETECTDATE に加えて、DATE または TIME HCOPG 指令 (あるいはその両方) を指定する場合、HCOPG は PostgreSQL 文字入力ホスト変数の内容を調査し、DATE および TIME 指令によって指定された日付の時間の形式に一致するフィールドを識別します。
一致が見つかると、HCOPG は入力ホスト変数形式のデータを PostgreSQL が理解する形式に変換します。
| シナリオ | DETECTDATE オプション |
|---|---|
| DB2 アプリケーションが PIC X 入力ホスト変数で DATE、TIME、および TIMESTAMP の値を使用しますが、それらの値は PostgreSQL 内の date、time、または timestamp 列でのみ使用します。 | CLIENT |
| DB2 アプリケーションが PIC X 入力ホスト変数で DATE、TIME、および TIMESTAMP の値を使用しますが、それらの値は PostgreSQL 内の character 列でのみ使用します。また、MySQL は、date、time、または timestamp データ型に対して、暗黙的な文字または明示的な文字のいずれも使用しません。 | 必要なし。DETECTDATE、DATE、または TIME HCOPG SQL コンパイラ指令オプションを使用しません。 |
| PostgreSQL で使用するのは、date、time、および timestamp 列での SQLTYPE ホスト変数のみで、PIC X ホスト変数を date、time、または timestamp 列で使用することはありません。 | 必要なし。1 |
| DB2 アプリケーションが PIC X 入力ホスト変数で DATE、TIME、および TIMESTAMP の値を使用します。さらに、PostgreSQL の character 列と date、time、および timestamp 列の両方でそれらの値を使用し、character 列は、DATE、TIME、または TIMESTAMP 値と混同される可能性のある形式のデータを使用する場合があります。 | SERVER |
| アプリケーションがデフォルトの SQL Server 形式と一致する DB2 メインフレームの DATE または TIME 形式 (あるいはその両方) を使用します。さらに、PostgreSQL の character 列または date 列 (あるいはその両方) でそれらの値を使用します。 | 必要なし。DETECTDATE、DATE、または TIME HCOPG SQL コンパイラ指令オプションを使用しません。 |
| 1オプションで、代替の日付時刻の HCOPG SQL コンパイラ指令オプションを使用できます。 | |
DIALECT 指令を MAINFRAME に設定し、TARGETDB 指令を POSTGRESQL、PGSQLAWS、または PGSQL のいずれかに設定して HCOPG を有効にすると、HCOPG は、次に示すようにメインフレームのデフォルトの形式で PostgreSQL の日時およびタイムスタンプのデータ型を返します。
| メインフレーム データ型 | PostgreSQL データ型 | メインフレーム デフォルト形式 |
|---|---|---|
| DATE | date | yyyy-mm-dd |
| TIME | time | hh.mm.ss |
| TIMESTAMP | timestamp | yyyy-mm-dd-hh.mm.ss.ffffff |
HCOPG は、SQL 文の中のリテラルもサポートします。この機能を有効にするには、DB2 メインフレーム アプリケーションの中のリテラル宣言の前に次の SQL コメントのいずれかを配置します。これらのコメントは、HCOPG にリテラル値が DB2 データベースの DATE、TIME、TIMESTAMP、または CHAR で使用されるかどうかについて指示します。
具体的には、CHAR リテラル指定は、HCOPG リテラルを変換したくない場合に非常に役に立ちます。