フレキシブル SQL

"フレキシブル SQL" と呼ばれる SQL ステートメント発行の追加機能では、任意の SQL 構文を使用できます。

このドキュメントでは、次のトピックについて説明します。


フレキシブル SQL の使用

SQL 構文(上記のセクションを参照)に加えて、フレキシブル SQL では任意の SQL 構文を使用できます。

文字 << および >>

フレキシブル SQL は << および >> 文字で囲まれます。任意の SQL テキストおよびホスト変数を指定できます。フレキシブル SQL 内では、ホスト変数の先頭にコロン(:)を付ける必要があります

フレキシブル SQL 文字列は複数のステートメント行にわたって指定することもできます。コメントも指定できます(PROCESS SQL ステートメントも参照)。

フレキシブル SQL は、次の SQL 構文項目と置き換えて使用できます。

フレキシブル SQL は、選択式の節間でも使用できます。

SELECT selection   
  << ... >> 
  INTO ... 
  FROM ... 
  << ... >> 
  WHERE ... 
  << ... >> 
  GROUP BY ... 
  << ... >> 
  HAVING ... 
  << ... >> 
  ORDER BY ... 
  << ... >>

注意:
フレキシブル SQL に使用される SQL テキストは Natural コンパイラには認識されません。SQL テキスト(置き換えられたホスト変数とともに)は単に SQL 文字列にコピーされ、データベースシステムに渡されます。フレキシブル SQL の構文エラーは、データベースで対応するステートメントが実行されるときにランタイムに検出されます。

例 1

SELECT NAME 
FROM SQL-EMPLOYEES 
WHERE << MONTH (BIRTH) >>  =  << MONTH (CURRENT_DATE) >>

例 2:

SELECT NAME 
FROM SQL-EMPLOYEES 
WHERE << MONTH (BIRTH) = MONTH (CURRENT_DATE) >>

例 3:

SELECT NAME 
FROM SQL-EMPLOYEES 
WHERE SALARY > 50000 
<< INTERSECT 
   SELECT NAME 
   FROM SQL-EMPLOYEES 
   WHERE DEPT = 'DEPT10'  
>>

フレキシブル SQL でのテキスト変数の指定

フレキシブル SQL 内では、"テキスト変数" を指定することもできます。

<<:T: host-variable [LINDICATOR:host-variable]>>

構文の各項目については、以下で説明します。

:T:

テキスト変数は接頭文字 :T: を付加した host-variable です。これは英数字フォーマットにする必要があります。

SQL ステートメント内のテキスト変数は、ランタイムにその内容で置き換えられます。つまり、テキスト変数に含まれるテキスト文字列が SQL 文字列に挿入されるということです。

置き換えの後、挿入されたテキスト文字列から末尾の空白が削除されます。

テキスト変数の内容が構文的に正しい SQL 文字列であることをユーザー自身が確実にする必要があります。特に、テキスト変数の内容に host-variables が含まれないようにする必要があります。

テキスト変数を含むステートメントは常にダイナミック SQL モードで実行されます。

LINDICATOR
LINDICATOR オプション:

テキスト変数の後にキーワード LINDICATOR と長さインジケータ変数(先頭にコロンを付加した host-variable)を指定できます。

長さインジケータ変数のフォーマット/長さは I2 にする必要があります。

LINDICATOR 変数を指定しない場合、テキスト変数の内容全体が SQL 文字列に挿入されます。

LINDICATOR 変数を指定した場合、テキスト変数の内容の先頭の n文字(nLINDICATOR 変数の値)のみが SQL 文字列に挿入されます。LINDICATOR 変数内の数がテキスト変数の内容の長さより大きい場合、テキスト変数の内容全体が挿入されます。LINDICATOR 変数内の数が負の値または 0 の場合は、何も挿入されません。

全般的な情報については、host-variable を参照してください。

テキスト変数の使用例

DEFINE DATA LOCAL 
   01 TEXTVAR (A200) 
   01 TABLES VIEW OF SYSIBM-SYSTABLES 
      02 NAME 
      02 CREATOR 
   END-DEFINE 
   * 
   MOVE 'WHERE NAME > ''SYS'' AND CREATOR = ''SYSIBM''' TO TEXTVAR  
   * 
   SELECT * INTO VIEW TABLES 
     FROM SYSIBM-SYSTABLES 
     << :T:TEXTVAR >> 
     DISPLAY TABLES 
   END-SELECT 
   * 
   END

生成される SQL ステートメント(LISTSQL システムコマンドで表示される)は次のようになります。

SELECT NAME, CREATOR FROM SYSIBM.SYSTABLES:T: FOR FETCH ONLY

実行される SQL ステートメントは次のようになります。

SELECT TABNAME, CREATOR FROM SYSIBM.SYSTABLES  
  WHERE TABNAME > 'SYS' AND CREATOR = 'SYSIBM'