OpenESQL での固定長文字列の処理

EXEC SQL 文では、PIC X(n) として宣言された COBOL 固定長文字列を入力ホスト変数、出力ホスト変数、またはその組み合わせとして使用できます。固定長文字列を使用したさまざまな例を次に示します。

例 1:HVIN ホスト変数を使用した入力の 2 つの文
 EXEC SQL INSERT INTO TAB1 (COL1)VALUES (:HVIN) END-EXEC
EXEC SQL DELETE * FROM TAB1 WHERE COL1 LIKE :HVIN END-EXEC
例 2:HVOUT ホスト変数を使用した出力の 1 つの文
 EXEC SQL SELECT COL1 INTO :HVOUT FROM DUAL END-EXEC
例 3:HVIN ホスト変数を使用した入力と HVOUT ホスト変数を使用した出力の 2 つの文
 EXEC SQL SELECT COUNT(*) INTO :HVOUT FROM TAB1 WHERE COL1 = :HVIN END-EXEC
 EXEC SQL SELECT 'START' || :HVIN ||'END' INTO :HVOUT FROM SYSIBM.SYSDUMMY1 END-EXEC

問題 - 後続空白文字を維持するか削除するか

通常、COBOL PIC X(n) ホスト変数は NULL 文字 ('\0') では終わらず、末尾に空白文字が続きます (詳細については「固定長文字列」を参照してください)。PIC X(n) ホスト変数は CHAR や VARCHAR などの DBMS SQL 列定義に応じてさまざまな方法で構成および使用されることがあるため、次のどちらの方法で処理すべきかが OpenESQL で問題になります。

  • 後続空白文字を維持する (後続空白文字をデータベースに渡す)
  • 後続空白文字を削除する (後続空白文字をデータベースに渡さない)

たとえば、上記の例 1 の INSERT 文について、COL1 が TAB1 の VARCHAR 列であるとすると、HVIN に含まれる後続空白文字は維持と削除のどちらが適切でしょうか。

同様に、例 1 の DELETE 文については、LIKE 述語で使用するとすると、HVIN に含まれる後続空白文字は維持と削除のどちらが適切でしょうか。

ソリューション

OpenESQL のデフォルトの動作を使用する
OpenESQL での PIC X(n) の後続空白文字の処理は、VARCHAR および WHERE の式の問題に対処するために長年にわたって改良されてきました。現在、OpenESQL のデフォルトの動作では、入力ホスト変数の値をデータベースに渡す前にすべての後続空白文字が除去されます。この唯一の例外は、PIC X(n) ホスト変数に空白文字のみが含まれている場合で、その場合はデータベースに単一の空白文字が渡されます。この方法の利点は、CHAR 列に格納する際はデータベース自体でホスト変数が後続空白文字で埋められ、VARCHAR 列については後続空白文字で埋められないことです。
固定長のホスト変数を可変長のホスト変数に置き換える
OpenESQL のデフォルトの動作以外で、VARCHAR DBMS 列の後続空白文字を適切に処理するためのベスト プラクティス (可能な場合) は、PIC X(n) ホスト変数を可変長文字列に置き換えることです (詳細については「可変長文字列」を参照してください)。この場合、プログラム自体で VARCHAR の長さと値を明示的に制御します。
RTRIM 関数および CAST 関数を使用する
この問題を解決するもう 1 つの方法は、移植可能な方法で特定の SQL 文を書き換える方法です。後続空白文字を削除する場合は RTRIM(:hvin) 関数、後続空白文字を維持する場合は CAST(:hvin as CHAR(n)) 関数を使用します (hvin は入力ホスト変数)。
PICXBINDING 指令を使用する
データベースで VARCHAR 列の空白文字を維持する必要があり、固定長のホスト変数を可変長に変更することも RTRIM 関数または CAST 関数を使用することもできない場合は、OpenESQL の PICXBINDING SQL コンパイラ指令オプションを使用して後続空白文字を維持または削除するように指定します。これは、SQL Server で LIKE 式を使用する場合などに便利です。詳細については、「PICXBINDING」を参照してください。
注: PICXBINDING は、指定された COBOL ソース ファイル内のすべての SQL 文および関連するホスト変数に適用されます。より細かな制御が必要な場合は、可変長のホスト変数を使用するか、特定の SQL 文で RTRIM 関数または CAST 関数を使用する必要があります。