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との接続に失敗した場合
レコードが無い なし コンポーネントの入力ストリーム なし 出力ストリーム型が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パラメータと同じですが、以下の点が異なります。