HCOPG の日付時刻のデータ型の処理

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 の形式を変換します。

入力ホスト変数 - DETECTDATE

変換する DB2 アプリケーションで PostgreSQL ではデフォルトでサポートされていない入力ホスト変数形式を使用している場合は、DETECTDATE HCOPG コンパイラ指令オプションを使用して DB2 形式を PostgreSQL 互換形式に変換します。DETECTDATE は、HCOPG に PostgreSQL の文字入力ホスト変数の内容を調べるように指示し、DATE、TIME、および TIMESTAMP データ用に指定されたメインフレーム形式に一致するデータを探します。

DATE および TIME データ型

日付と時間の変換に対処するために DETECTDATE 指令のみを使用して処理された DATE および TIME データ型に関しては、HCOPG は PostgreSQL 文字入力ホスト変数の内容を調査し、デフォルトの DATE および TIME DB2 メインフレーム形式 (それぞれ yyyy-mm-ddhh.mm.ss) に基づいて一致するフィールドを識別します。

DETECTDATE に加えて、DATE または TIME HCOPG 指令 (あるいはその両方) を指定する場合、HCOPG は PostgreSQL 文字入力ホスト変数の内容を調査し、DATE および TIME 指令によって指定された日付の時間の形式に一致するフィールドを識別します。

TIMESTAMP データ型
TIMESTAMP データ型に関しては、DETECTDATE が入力ホスト変数を調べるように HCOPG に指示し、次のいずれかの DB2 TIMESTAMP 形式との一致を探します。
  • yyyy-mm-dd-hh.mm.ss.ffffff
  • yyyy-mm-dd hh.mm.ss.ffffff
  • yyyy-mm-dd hh:mm:ss.ffffff
  • yyyy-mm-ddThh.mm.ss.ffffff
  • yyyy-mm-ddThh:mm:ss.ffffff

一致が見つかると、HCOPG は入力ホスト変数形式のデータを PostgreSQL が理解する形式に変換します。

DETECTDATE の使用に関するガイドライン
DETECTDATE 指令を使用すると、処理上の大幅なオーバーヘッドが生まれる可能性があります。これを最小限にするために、以下の使用シナリオで提示したガイドラインに従うことをお勧めします。
シナリオ 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 コンパイラ指令オプションを使用できます。
注: すべての DETECTDATE オプションの詳細については、DETECTDATE 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
DATE および TIME 指令
また、オプションの DATE および TIME HCOPG 指令を指定できます。これにより、USA、EUR、または JIS など、PostgreSQL の日付と時刻の列に対して異なる出力ホスト変数の形式を指定できます。
注: DETECTDATE 指令を省略すると、DATE および TIME 指令は出力形式にのみ影響します。
DATE、TIME、および DETECTDATE 指令
DETECTDATE 指令に加えて、DATE または TIME 指令 (あるいはその両方) を指定する場合、指定した DATE および TIME 形式は入力および出力ホスト変数の両方の形式を決定します。

SQL 文における日付時刻のリテラル

HCOPG は、SQL 文の中のリテラルもサポートします。この機能を有効にするには、DB2 メインフレーム アプリケーションの中のリテラル宣言の前に次の SQL コメントのいずれかを配置します。これらのコメントは、HCOPG にリテラル値が DB2 データベースの DATE、TIME、TIMESTAMP、または CHAR で使用されるかどうかについて指示します。

  • /*#CHAR*/
  • /*#DATE*/
  • /*#TIME*/
  • /*#TIMESTAMP*/

具体的には、CHAR リテラル指定は、HCOPG リテラルを変換したくない場合に非常に役に立ちます。