# SQL文生成方式

SQL文生成方式には"簡易指定"と"SQL文指定"の2通りがあります。

(1) 簡易指定

DBテーブル情報で指定した「テーブル名」、「ソート方法」、「項目名」に基づいて、内部で自動にSQL文を生成してデータベースに対する入出力を行います。

a) 入力用SQL文の生成例

テーブル「emp」に項目“col1”、“col2”が定義されているとします。

図4.99 入力用SQL文の生成例

b) 出力用SQL文の生成例

テーブル「emp」に項目「col1」、「col2」が定義されていて、それぞれ「入力データ1」、「入力データ2」にマッピングされているとします。

図4.100 出力用SQL文の生成例

c) 更新方法の設定

DBテーブル情報詳細画面で、テーブルの更新方法を設定できます。

- INSERT

  常に登録（INSERT）します。

- FastLoadを使用してINSERT

  SQL ServerのFastLoadを使用してINSERTします。

- ダイレクト・パス・ロードを使用してINSERT

  Oracleのダイレクト・パス・ロードを使用して登録（INSERT）します。接続先のデータベースがOracleの場合に表示されます。

- BULK INSERT

  BULK INSERTで登録します。接続先のデータベースがPostgreSQLまたはODBCの場合に表示されます。ODBCは、接続先がRedshiftまたはSnowflakeの場合にのみ使用可能です。

- キーの値と一致する行はUPDATE

  キーの値が一致する行は更新（UPDATE）し、キーの値が一致しない行は登録（INSERT）します。ただし、キー値を設定しなかった場合は、常に登録（INSERT）の動作となります。

(2) SQL文指定

データベースに対する入出力を行うSQL文を自由に記述できます。

a) 入力設定のSQL文

「入出力区分」が"入力"の場合は、データベースからデータを取り出すためのSELECT文を指定してください。

b) 出力設定のSQL文中での入力データの記述

出力用のSQL文（INSERT、UPDATE）中に、マッピング情報で指定した入力データを記述したい場合は、以下のように記述します。

表4.8 SQL文中での入力データ記述方法

データベース | 記述方法
--- | ---
Oracle | :xxx（*1）
DB2 | ?
SQLite3 | ?
SQLServer（*2） | ?
PostgreSQL | $n（*3）
ODBC | (*4)

*1 | : | xxxには任意の文字を指定してください。ただし「?」は使用できません。 SQL文中に複数の入力データを記述する場合、すべて同じ文字を使用しても異なる文字を使用してもかまいません。 例）
    UPDATE emp SET col2=?, col3=? WHERE col1=?;← DB2の場合
    UPDATE emp SET col2=:1, col3=:2 WHERE col1=:3;← Oracleの場合
*2 | : | Windowsのみです。
*3 | : | nには数字を指定してください。
*4 | : | 入力データの記述方法については、接続先のデータベースのドキュメントを参照してください。

上記の入力データの記述は、有効な項目情報と同数必要です。

以下のケースでは「有効無効」が「有効」となっている項目数が3つ存在するので、入力データの記述が3つ必要です。

画面4.58 「有効」が3つ存在するケース

注意

- 出力用のSQL文が正しく実行されるようにするため、「連結順序」を適切に設定してください。Oracleの場合も、「:1」、「:2」、「:3」というSQL文中の数字に関係なく、「連結順序」に従って処理されます。

- PostgreSQLでは、SQL文に記載した記述方法の番号に従って処理されます。

  PostgreSQLでは、「有効無効」が「有効」の項目について、「連結順序」の順番に従って「$1」「$2」「$3」が割当てられます。

  以下のケースでは、「col1」「col5」「col4」の順に「$1」「$2」「$3」が割り当てられます。

  画面4.59 「連結順序」

  SQL文の複雑化を避けるため、PostgreSQLで「$1」「$2」「$3」のような入力データを記述する場合は、以下のように「連結順序」を昇順の連番とし、SQL文の「$1」「$2」「$3」を入れ替えて記述する方法を推奨します。

  画面4.60 「連結順序」を昇順に表示

SQL文例）

    insert into "test" values($1, NULL, NULL, $2, $3)

- 「SQL1」、または「SQL2」にSELECT文を指定するとエラーになる場合があります。

c) 出力時のSQL文実行方法

DB出力の場合は、2つの異なるSQL文を実行できます。

たとえば、まずINSERT文を実行し、PRIMARY KEYによる一意整合性エラーが発生した場合のみUPDATE文を発行したい場合は、以下のように指定できます。

図4.101 SQL1、SQL2の実行例（Oracleの場合）

注意

"SQL1に失敗した場合のみSQL2まで実行"を指定した場合でも、指定したSQLの文法に誤りがあるときなど、SQL2まで実行されない場合があります。