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の指定有無で決まります。詳細を次の表に示します。
2進項目のデータ記述のUSAGE句 |
コンパイラオプション-BigEndian,Binの指定 |
2進項目のバイトオーダ |
---|---|---|
BINARY,COMP又はCOMP-4 |
指定しない |
リトルエンディアン |
指定する |
ビッグエンディアン |
|
COMP-5※ |
指定しない |
リトルエンディアン |
指定する |
(2) クライアントライブラリ内で行うバイトオーダ変換
COBOLの埋込み型UAPでは,SQL文で使用する2進項目のデータ記述のUSAGE句に,一部の例外を除いて※,COMPを指定することになっています。したがって,-BigEndian,Binを指定してコンパイルすると,UAPの実行時にSQL文で使用する2進項目のバイトオーダがビッグエンディアンになります。クライアントライブラリはSQL文で使用する2進項目をC言語の整数型データ(Linux及びWindows環境ではリトルエンディアン)として処理するので,クライアントライブラリ内ではSQL文で使用する2進項目をリトルエンディアンに変換して処理します。
- 注※
-
ROW型変数にCOMP-5を使用できます。
クライアントライブラリ内で行うバイトオーダ変換を次の図に示します。
バイトオーダ変換の対象となる「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型変数を除く)のバイトオーダと,データ記述,オプション指定の関係を次の表に示します。
項番 |
項目 |
各項目の指定内容 |
||
---|---|---|---|---|
SQL文で使用する2進項目(ROW型変数を除く)のバイトオーダをリトルエンディアンにする場合 |
SQL文で使用する2進項目(ROW型変数を除く)のバイトオーダをビッグエンディアンにする場合 |
|||
1 |
SQL文で使用する2進項目(ROW型変数を除く)のデータ記述のUSAGE句 |
COMP |
COMP |
|
2 |
SQLプリプロセサの-Xbオプション |
指定しない |
指定する |
|
3 |
コンパイラオプション |
-BigEndian,Bin |
指定しない |
指定する |
4 |
-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をバイトオーダの異なるプラットフォームへ移行する手順の例を次の図に示します。
(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文を正常に実行できないことがあるため,そのような指定をしないでください。