320.3. ストアドプロシージャーテンプレートの宣言
テンプレートは、Java メソッドシグネチャーに似た構文を使用して宣言されます。ストアドプロシージャーの名前と、括弧で囲まれた引数。例はこれをよく説明しています:
<to uri="sql-stored:STOREDSAMPLE(INTEGER ${headers.num1},INTEGER ${headers.num2},INOUT INTEGER ${headers.num3} result1,OUT INTEGER result2)"/>
<to uri="sql-stored:STOREDSAMPLE(INTEGER ${headers.num1},INTEGER ${headers.num2},INOUT INTEGER ${headers.num3} result1,OUT INTEGER result2)"/>
引数は型によって宣言され、単純な式を使用して Camel メッセージにマッピングされます。したがって、この例では、最初の 2 つのパラメーターは INTEGER 型の IN 値であり、メッセージヘッダーにマップされます。3 番目のパラメーターは INOUT です。これは、INTEGER を受け入れてから別の INTEGER 結果を返すことを意味します。最後のパラメーターは OUT 値で、これも INTEGER 型です。
SQL 用語では、ストアドプロシージャーは次のように宣言できます。
CREATE PROCEDURE STOREDSAMPLE(VALUE1 INTEGER, VALUE2 INTEGER, INOUT RESULT1 INTEGER, OUT RESULT2 INTEGER)
CREATE PROCEDURE STOREDSAMPLE(VALUE1 INTEGER, VALUE2 INTEGER, INOUT RESULT1 INTEGER, OUT RESULT2 INTEGER)
320.3.1. IN パラメーター
IN パラメーターは、スペースで区切られた 4 つの部分 (パラメーター名、SQL 型 (位取りあり)、型名、および値のソース) を取ります。
パラメーター名はオプションであり、指定されていない場合は自動生成されます。引用符 (') の間に指定する必要があります。
SQL タイプは必須であり、整数 (正または負) または一部のクラスの整数フィールドへの参照にすることができます。SQL 型にドットが含まれている場合、コンポーネントはそのクラスを解決して、指定されたフィールドを読み取ろうとします。たとえば、SQL 型 com.Foo.INTEGER は、クラス com.Foo のフィールド INTEGER から読み取られます。型にコンマが含まれていない場合、整数値を解決するクラスは java.sql.Types になります。型は位取りによって接尾辞を付けることができます。たとえば、DECIMAL(10) は位取り 10 の java.sql.Types.DECIMAL を意味します。
型名はオプションで、引用符 (') で囲む必要があります。
値のソースが必要です。値のソースは、Exchange からパラメーター値を取り込みます。Simple 式またはヘッダーの場所、つまり :#<header name>. のいずれかです。たとえば、Simple 式 ${header.val} は、パラメーター値がヘッダー val から読み取られることを意味します。ヘッダー位置式 :#val は同じ効果があります。
<to uri="sql-stored:MYFUNC('param1' org.example.Types.INTEGER(10) ${header.srcValue})"/>
<to uri="sql-stored:MYFUNC('param1' org.example.Types.INTEGER(10) ${header.srcValue})"/>
URI は、ストアドプロシージャーがパラメーター名 param1 で呼び出されることを意味します。その SQL タイプはクラス org.example.Types フィールド INTEGER から読み取られ、スケールは 10 に設定されます。パラメーターの入力値は、ヘッダー srcValue から渡されます。
<to uri="sql-stored:MYFUNC('param1' 100 'mytypename' ${header.srcValue})"/>
<to uri="sql-stored:MYFUNC('param1' 100 'mytypename' ${header.srcValue})"/>
URI は、SQL-type が 100 で型名が mytypename であることを除いて、前と同じです。
実際の呼び出しは org.springframework.jdbc.core.SqlParameter を使用して行われます。
320.3.2. OUT パラメーター
OUT パラメーターは IN パラメーターと同様に機能し、SQL 型 (位取り付き)、型名、および出力パラメーター名の 3 つの部分を含みます。
SQL タイプは、IN パラメーターと同じように機能します。
タイプ名はオプションであり、IN パラメーターと同じように機能します。
出力パラメーター名は、OUT パラメーター名と、結果が格納されるヘッダー名に使用されます。
<to uri="sql-stored:MYFUNC(OUT org.example.Types.DECIMAL(10) outheader1)"/>
<to uri="sql-stored:MYFUNC(OUT org.example.Types.DECIMAL(10) outheader1)"/>
URI は、OUT パラメーターの名前が outheader1 であり、結果がヘッダー outheader1 になることを意味します。
<to uri="sql-stored:MYFUNC(OUT org.example.Types.NUMERIC(10) 'mytype' outheader1)"/>
<to uri="sql-stored:MYFUNC(OUT org.example.Types.NUMERIC(10) 'mytype' outheader1)"/>
これは前のものと同じですが、タイプ名は mytype になります。
実際の呼び出しは org.springframework.jdbc.core.SqlOutParameter を使用して行われます。
320.3.3. INOUT パラメーター
INOUT パラメーターは、上記のすべての組み合わせです。エクスチェンジから値を受け取り、結果をメッセージヘッダーとして保存します。唯一の注意点は、IN パラメーターの名前がスキップされることです。代わりに、OUT パラメーターの名前は、SQL パラメーター名と結果ヘッダー名の両方を定義します。
<to uri="sql-stored:MYFUNC(INOUT DECIMAL(10) ${headers.inheader} outheader)"/>
<to uri="sql-stored:MYFUNC(INOUT DECIMAL(10) ${headers.inheader} outheader)"/>
Actual call will be done using org.springframework.jdbc.core.SqlInOutParameter.