Hitachi

ノンストップデータベース HiRDB Version 10 UAP開発ガイド


8.2.11 COBOLのビッグエンディアンオプションへの対応

プリプロセスオプション-Xb(Windows版の場合は/Xb)を指定してプリプロセスすることで,COBOLのビッグエンディアンオプションが利用できるようになります。

〈この項の構成〉

(1) COBOLのビッグエンディアンオプション

COBOLのプログラムをAIXなどのビッグエンディアンのプラットフォームからLinuxなどのリトルエンディアンのプラットフォームに移行する場合,2進項目(2進形式の数字項目)のバイトオーダが変わるために,ソースプログラムの変更が必要になることがあります。これを回避するために,COBOL2002のコンパイラオプション-BigEndian,Binがあります。-BigEndian,Binは,Linux及びWindows環境で,2進項目のバイトオーダをビッグエンディアンにするオプションです。なお,HiRDBの埋込み型UAPではCOBOL2002のコンパイラオプション-BigEndian,Floatに対応していません。

COBOL2002では,2進項目のデータ記述で,USAGE句にBINARY,COMP,COMP-4,COMP-5のどれかを指定します。Linux及びWindows環境では,2進項目のバイトオーダはUSAGE句の指定内容とコンパイラオプション-BigEndian,Binの指定有無で決まります。詳細を次の表に示します。

表8‒14 Linux及びWindows環境の2進項目のバイトオーダ(COBOL2002の仕様)

2進項目のデータ記述のUSAGE句

コンパイラオプション-BigEndian,Binの指定

2進項目のバイトオーダ

BINARY,COMP又はCOMP-4

指定しない

リトルエンディアン

指定する

ビッグエンディアン

COMP-5

指定しない

リトルエンディアン

指定する

注※

COMP-5を使用する場合は,コンパイラオプション-Comp5を指定する必要があります。-Comp5を指定しないでCOMP-5を使用するとコンパイルエラーになります。

(2) クライアントライブラリ内で行うバイトオーダ変換

COBOLの埋込み型UAPでは,SQL文で使用する2進項目のデータ記述のUSAGE句に,一部の例外を除いて,COMPを指定することになっています。したがって,-BigEndian,Binを指定してコンパイルすると,UAPの実行時にSQL文で使用する2進項目のバイトオーダがビッグエンディアンになります。クライアントライブラリはSQL文で使用する2進項目をC言語の整数型データ(Linux及びWindows環境ではリトルエンディアン)として処理するので,クライアントライブラリ内ではSQL文で使用する2進項目をリトルエンディアンに変換して処理します。

注※

ROW型変数にCOMP-5を使用できます。

クライアントライブラリ内で行うバイトオーダ変換を次の図に示します。

図8‒3 クライアントライブラリ内で行うバイトオーダ変換

[図データ]

バイトオーダ変換の対象となる「SQL文で使用する2進項目」とは,次のデータ項目に含まれる2進項目です。

  • 埋込み変数

  • ?パラメタの値を格納するデータ項目

  • 標識変数

  • ?パラメタの標識を格納するデータ項目

  • SQL連絡領域

  • SQL記述領域

  • 列名記述領域

  • 型名記述領域

  • 文字集合名記述領域

ただし,ROW型変数に格納する行データに含まれる2進項目については,前述のバイトオーダ変換を行いません。このため,Linux及びWindows環境で,ROW型変数に含まれる2進項目のバイトオーダは,-BigEndian,Binオプションの有無に関係なく,リトルエンディアンにする必要があります。したがって,ROW型変数に含まれる2進項目はビッグエンディアンを前提にした処理で使用できません。

注※

ROW型変数とは,SQLの行単位インタフェースで使用するROW型の埋込み変数,及びROW型の?パラメタの値を格納するデータ項目です。

(3) 埋込み型UAPでCOBOLのビッグエンディアンオプションを使用する方法

埋込み型UAPのコンパイルで-BigEndian,Binオプションを使用する場合は,プリプロセスオプション-Xb(Windows環境では/Xb)を指定してプリプロセスします。プリプロセスオプション-Xbを指定すると,クライアントライブラリ内で,SQL文で使用する2進項目のバイトオーダを変換します。コンパイル時には-BigEndian,Binオプションと同時に-Comp5オプションを指定します。Linux及びWindows環境で,SQL文で使用する2進項目(ただし,ROW型変数を除く)のバイトオーダと,データ記述,オプション指定の関係を次の表に示します。

表8‒15 SQL文で使用する2進項目のバイトオーダと,データ記述,オプション指定の関係

項番

項目

各項目の指定内容

SQL文で使用する2進項目(ROW型変数を除く)のバイトオーダをリトルエンディアンにする場合

SQL文で使用する2進項目(ROW型変数を除く)のバイトオーダをビッグエンディアンにする場合

1

SQL文で使用する2進項目(ROW型変数を除く)のデータ記述のUSAGE句

COMP

COMP

2

SQLプリプロセサの-Xbオプション

指定しない

指定する

3

コンパイラオプション

-BigEndian,Bin

指定しない

指定する

4

-Comp5

任意

指定する

注※

-Xbオプションを指定すると,SQLプリプロセサが展開するポストソース中でCOMP-5を使用するため,コンパイラオプションに-Comp5を指定する必要があります。

プリプロセスオプション-Xbを使用する場合は,ROW型変数に含まれる2進項目のデータ記述のUSAGE句をCOMP-5にする必要があります。なお,プリプロセスオプション-Xbを使用しない場合は,ROW型変数に含まれる2進項目のデータ記述のUSAGE句にCOMPとCOMP-5のどちらも指定できます。ROW型変数に含まれる2進項目のデータ記述にCOMP-5を指定することによって,Linux及びWindows環境で,ROW型変数に含まれる2進項目のバイトオーダは,-BigEndian,Binオプションの有無に関係なく,リトルエンディアンになります。

埋込み型UAPをビッグエンディアンのプラットフォームからリトルエンディアンのプラットフォームに移行する場合,コンパイラオプション-BigEndian,Binとプリプロセスオプション-Xbを組み合わせて使用することによって,ROW型の変数を使用する場合を除き,2進項目のバイトオーダの違いに対応するためにUAPソースを変更する必要がなくなります。COBOLの埋込み型UAPをバイトオーダの異なるプラットフォームへ移行する手順の例を次の図に示します。

図8‒4 COBOLの埋込み型UAPをバイトオーダの異なるプラットフォームへ移行する手順の例

[図データ]

(4) 注意事項

  • コンパイラオプション-BigEndian,Binとプリプロセスオプション-Xbは必ず組み合わせて使用してください。一方を指定して他方を指定しなかった場合,クライアントライブラリの動作を保証しません。

  • コンパイラオプション-BigEndian,Binとプリプロセスオプション-Xbを指定した場合,クライアントライブラリ内でバイトオーダ変換のためのオーバヘッドが発生します。このため,必要のないかぎりこのオプションは指定しないでください。コンパイラオプション-BigEndian,Binが必要になる条件についてはCOBOL2002のマニュアルを参照してください。

  • コンパイラオプション-BigEndian,Binとプリプロセスオプション-Xbを指定し,かつインタフェース領域の内容の誤りによってSQL文で使用する2進項目のバイトオーダ変換が失敗した場合は,クライアント環境定義のPDPRMTRCの指定に関係なく,SQLトレースにパラメタ情報を出力しません。

    インタフェース領域については,「インタフェース領域」を参照してください。

  • コンパイラオプション-BigEndian,Binとプリプロセスオプション-Xbを指定した場合,SQL文で使用する入力用2進項目の内容をSQL文の実行中だけ一時的にリトルエンディアンに変換します。このため,複数のプロセスやスレッドで同時に入力用2進項目のデータ領域を共用しないでください。共用すると,同時に実行するプログラムが,バイトオーダが逆転したデータを参照して,不正な動作をします。また,1つのSQL文中の複数個所に入力用2進項目を含む同じ埋込み変数を指定すると,SQL文を正常に実行できないことがあるため,そのような指定をしないでください。



目次