SQLCall - SQLの実行

任意のSQLの実行を行います。

フローサービスでRDBのフィールドを扱うためには、フローサービスのデータ型に各RDBのフィールドの型を対応させる必要があります。各種RDBのフィールドとフローサービスのデータ型との対応については、フローサービスマニュアルの「RDBとのデータ型の相互変換」を参照してください。

■ストリーム情報

入力フォーマットすべて
接続数1
説明 入力ストリームは使用せず、すべて無視します。
出力フォーマットすべて
説明実行する処理 が「SELECT文を発行」または「ストアド実行(結果あり)」の場合は、出力ストリームはRecordになります。
実行する処理 が「任意のSQLを実行」または「ストアド実行(結果なし)」の場合は、入力ストリームをそのまま出力します。

■コンポーネントプロパティ

名前プロパティ型マッピング説明
コネクション名connection- 接続先のRDBを指定します。 コネクションペインまたは管理コンソールにて作成されたRDB接続名を選択します。
実行する処理choice- 実行するSQLの種類を指定します。
各種類ごとの動作は、下記トピック「実行する処理ごとの動作」を参照してください。
任意のSQLを実行 [SQL]
SELECT以外の任意のSQLを実行する場合に使用します。
SELECT文を発行 [SQL-Record]
SELECT文を実行する場合に使用します。
ストアド実行(結果なし) [Procedure]
結果セットを返さないストアドプロシージャを実行する場合に使用します。
ストアド実行(結果あり) [ProcedureRecord]
結果セットを返すストアドプロシージャを実行する場合に使用します。
SQL文string入力&出力 実行するSQLまたはProcedureを記述します。
フロー実行時の動的な値を含めるためのSQLまたはProcedureの記述方法は、下記トピック「SQLパラメーターの使い方」を参照してください。
ループを開始loopProcess-実行する処理 が「SELECT文を発行」または「ストアド実行(結果あり)」の場合、結果セットをまとめて出力するか1レコードずつループして出力するかを選択します。実行する処理 がこれ以外はプロパティが表示されません。
はい [true] - ループの起点となって1レコードずつストリームに出力します。
いいえ [false] - すべてのレコードがまとめてストリームに出力します。
タイムアウト(秒)int入力&出力 DBMSに対してSQL文を発行してから結果が返ってくるまでの待ち時間を秒単位で指定します。
指定時間を経過しても実行が終わらない場合はエラーになります。0の場合、タイムアウトしません。
レコードが無い場合エラーboolean- 結果セットのレコード件数が0件だった場合にエラーを発生するかどうかを選択します。
はい [true] - エラーを発生します。
いいえ [false] - 空のストリームを出力します。
処理件数int   出力実行する処理 が「任意のSQLを実行」の場合に更新されたレコード件数が取得できます。
実行する処理 がそれ以外の場合はプロパティが表示されません。
トランザクションに含めるboolean- DBMSとの接続をトランザクションに含めるかどうかを選択します。
実行する処理が更新を伴わないものであり、フローがトランザクション化されていない場合は「いいえ」 にした方がフロー全体の処理速度があがります。
はい [true] - コンポーネントの処理をトランザクションに含めます。
いいえ [false] - コンポーネントの処理をトランザクションに含めません。
SQLパラメーターを使用するboolean- $,? を使用したいときにこのプロパティを「いいえ」にするとSQLパラメーター置換処理をせずコンポーネントを実行できます。 また、この場合はSQLパラメーターが設定されていても無視されるので注意してください。
ストアド実行(結果あり)の場合、「? = call procedulre_name( )」等記述してある場合動作しなくなります。
はい [true] - SQL文のSQLパラメーター書式の文字を置換します。
いいえ [false] - SQL文のSQLパラメーター書式の文字を置換をしません。
SQLパラメーターcategory入力&出力 パラメーター名、入出力種別、データ型、値のセットで定義します。
値は、前に連結したマッパーからマッピングすることが可能です。また、入出力種別で出力するパラメーターは直後に連結したマッパーから参照することもできます。詳細については、下記トピック「SQLパラメーターの使い方」を参照してください。

■ループ処理

出力ストリームがRecordで、かつループを開始 が「はい」の場合、このコンポーネントがループの起点となって結果セットのレコードを1レコードずつ出力します。

■トランザクション処理

コミットトランザクションに含める が「はい」の場合、DBMSをコミットします。
ロールバックトランザクションに含める が「はい」の場合、DBMSをロールバックします。

■エラー処理

タイプパラメーターエラー処理フロー
へのストリーム
エラー
コード
説明
汎用 なし コンポーネントの入力ストリーム なし コネクション名 に指定したコネクションが見つからない場合
データベースベンダー固有の例外コードSQLまたはProcedureの実行に失敗した場合
データベースベンダー固有の例外コードSQL文 がタイムアウトした場合
接続エラー なし コンポーネントの入力ストリーム なし DBMSとの接続に失敗した場合
レコードが無い なし コンポーネントの入力ストリーム3出力ストリーム型がRecordとなる場合かつレコードが無い場合エラー が「はい」で、結果セットが0行の場合

■制限事項

データベースにMicrosoft Accessを使用し、本コンポーネントの実行する処理 プロパティが「SELECT文を発行」または「ストアド実行(結果あり)」の場合、フローの開始コンポーネントの「トランザクション化」プロパティを「いいえ」、本コンポーネントのループを開始 プロパティを「はい」、トランザクションに含める プロパティを「はい」にする組合せは利用できません。

■フローの強制終了

フローを強制終了すると、通常は実行中のコンポーネントの処理が終了してから次のコンポーネントに制御が遷移する時点でフローがアボートしますが、本コンポーネントでは実行中の処理を強制的に終了してフローがアボートします。

■実行する処理ごとの動作

任意のSQLを実行

SELECT以外の任意のSQLを実行する場合に使用します。
SQL文 にはInsert、Update、Delete、Create Tableなど、DBMSのサポートするあらゆるSQLを記述することができます。

SELECT文を発行

SELECT文を実行する場合に使用します。
SQL文 には実行するSELECT文を記述します。 結果セットとフィールド定義の関係は、下記トピック「SQL文中のカラムと出力ストリームのフィールドの関係」を参照してください。

ストアド実行(結果なし)

結果セットを返さないストアドプロシージャを実行する場合に使用します。
SQLの書式は次のように、実行するプロシージャを{ callと}で囲んで記述します。 この例ではPROC-NAMEがプロシージャ名、P1、P2がSQLパラメーター名です。

{ call PROC-NAME( ?P1?, ?P2?)}

DBMSがOracleの場合は、次のようにファンクションを指定して出力するパラメーターを先頭に定義することも可能です。

{ ?RET? = call FUNC-NAME(?P1?, ?P2?)}

ストアド実行(結果あり)

結果セットを返すストアドプロシージャを実行する場合に使用します。
DBMSがOracle以外の場合、記述方法は「ストアド実行(結果なし)」と同じです。この場合、実行するプロシージャは結果セットを返す必要があります。
DBMSがOracleの場合、SQLパラメーター の定義でデータ型「RESULTSET」を使用して、取得する結果セットパラメーターがどこにあるかを指定する必要があります。詳細については、下記トピック「SQLパラメーターの使い方」を参照してください。

{ ?RS? = call hoge(?P1?)}
{ call fuga(?P1?, ?RS?)}
※RSがデータ型「RESULTSET」のSQLパラメーターとします。

この場合、データ型「RESULTSET」のSQLパラメーターは任意の位置に記述できます。ただし、複数指定することはできません。Oracle以外のDBMSでは、2番目の例のようにパラメーターとして結果セットをやり取りするプロシージャは実行できません。

結果セットとフィールド定義の関係は、下記トピック「SQL文中のカラムと出力ストリームのフィールドの関係」を参照してください。

■SQL文中のカラムと出力ストリームのフィールドの関係

本コンポーネントの出力ストリームとしてレコードを取得するには、ストリームペインにフィールドを定義する必要がありますが、SQL文中の各カラムと出力ストリームのフィールドは順序によってマッピングされるため、カラム名とフィールド名は一致する必要はありません。

カラム数が出力ストリームで定義されたフィールド数と異なる場合や、カラムのデータ型が対応するフィールドのデータ型と異なる場合でも、順序によってマッピングされます。

■SQLパラメーターの使い方

SQLパラメーターを使うと、実行時の動的な文字列を含むSQL文を実行することができます。SQL文 に記述する際に、SQLパラメーターで定義した任意の名前のパラメーター名を含むSQL文を記述します。本コンポーネントの前にマッパーを配置し、定義したパラメーターにマッピングすることにより、実行時の動的な文字列を含むSQL文を実行することができます。

パラメーターには、以下の2つの書式があります。

SQLパラメーター書式

SQLパラメーター書式は、SQL文中のフィールド値となる箇所で使います。パラメーターの定義では、フィールドに対応したデータ型を指定します。SQL文 で、置き換えたい文字列を使用する部分に「?パラメーター?」のようにパラメーター名を?で囲んで記述します。

置換文字列書式

置換文字列書式は、SQL文中の任意の箇所で使います。パラメーターの定義では、データ型にStringを指定します。SQL文 で、置き換えたい文字列を使用する部分に「$パラメーター名$」のようにパラメーター名を$で囲んで記述します。

●SQLパラメーターを使ってSQL文 を記述する

以下の手順で記述します。

  1. 本コンポーネントをクリックするとインスペクタに表示されるSQLパラメータータブで、任意の名前、入出力種別、データ型、初期値を入力します。
  2. SQL文 に、置き換えたい文字列を使用する部分によって「?パラメーター名?」または「$パラメーター名$」のようにフィールド名を?または$で囲んで記述します。
  3. 本コンポーネントの前にマッパーを配置します。
  4. マッピングウィンドウの出力側にあるSQLパラメーターのフィールド名に置換文字列となるフィールドをマッピングします。

入出力種別について

実行する処理 が「任意のSQLを実行」または「SELECT文を発行」の場合、入出力種別はすべて「入力」を指定します。ストアド実行(結果なし)」または「ストアド実行(結果あり)」の場合は、ストアドプロシージャの入出力タイプに応じて指定します。

Oracleで結果セットありのストアドプロシージャを実行する場合

DBMSがOracleで、実行する処理 が「ストアド実行(結果あり)」の場合、SQLパラメーターを定義する際にデータ型にRESULTSETを指定し、このパラメーターを用いて結果セットの位置を指定する必要があります。
※RESULTSETは、この場合にのみ使用するデータ型です。

●パラメーターを編集する

SQLパラメータータブで、フィールドを右クリックして表示されるメニューから「上に移動」「下に移動」「挿入」「削除」を操作します。

CSV形式で編集する

パラメーターフィールドリストをCSV形式で表現した一覧を、いつも使用しているエディタで編集することができます。パラメーターフィールドリストのCSV形式は、各項目の文字列をカンマ(,)区切りで表現しています。以下に、例と項目の説明を示します。

para1,in,VARCHAR,TEST
para2,in/out,VARCHAR,SAMPLE
項目名内容
パラメーター名パラメーター名。
入出力入力の場合、in。
入出力の場合、in/out。
出力の場合、out。
データ型データ型。
値。指定しなかった場合は空文字になります。

フローデザイナーのテキストエディタが表示されます。いつも使用しているエディタで編集するには、テキストエディタ画面上部にある「外部エディタ」ボタンをクリックします。関連付けられたエディタが起動されます。

●注意事項

●例

SQL文 の値が以下の場合

SELECT GROUP, NAME, KANA FROM EMPLOYEE WHERE GROUP = ?GROUP? ORDER BY $ORDER$

SQLパラメーター が以下の場合

GROUP=Sales
ORDER=KANA

実際に発行されるSQL文は、以下のようになります。GROUPのパラメーターには「Sales」、ORDERのパラメーターには「KANA」という値が入ります。

SELECT GROUP, NAME, KANA FROM EMPLOYEE WHERE GROUP = Sales ORDER BY KANA

●補足

SQLパラメーターの基本的な概念はRDBGetコンポーネントで使用するSQLパラメーターと同じですが、以下の点が異なります。