DB2 10.5 for Linux, UNIX, and Windows
CLI アプリケーションからのストアード・プロシージャーの呼び出し
CLI アプリケーションは、CALL プロシージャー・ステートメントを発行することにより、ストアード・プロシージャーを呼び出します。
始める前に
手順
ストアード・プロシージャーを呼び出すには、以下のようにします。
タスクの結果
ストアード・プロシージャーが正常に実行された場合、OUT パラメーターとしてバインドされた変数には、そのストアード・プロシージャーが CLI アプリケーションに戻したデータが含まれます。 OUT パラメーター・データ値は、SQLGetData() 関数を使用して取得できます。 ストアード・プロシージャーが順方向カーソルを介して 1 つ以上の結果セットを返した場合には、SQLFetch() 関数を使用して結果セットを取得できます。
ストアード・プロシージャーによって返された結果セットに含まれる列の数またはタイプが CLI アプリケーションで不明である場合は、 その結果セットに対して SQLNumResultCols() 関数、SQLDescribeCol() 関数、および SQLColAttribute() 関数を (この順序で) 呼び出して、この情報を判別することができます。
ストアード・プロシージャーから DATETYPE データが返される場合、DATETYPE データはロケールに依存したフォーマットで返されます。返される DATETYPE データのフォーマットを変更するには、以下のように DB2_SQLROUTINE_PREPOPTS レジストリー変数をロケールに依存しない値 (例えば ISO) に設定します。
db2set DB2_SQLROUTINE_PREPOPTS="DATETIME ISO"
例
CREATE PROCEDURE testproc (IN var1 INTEGER, OUT var2 INTEGER )
LANGUAGE SQL
BEGIN
var2 = var1 * 10;
END
//For IN parameter var1
SQLINTEGER param1[5] = {1,2,3,4,5};
//For OUT parameter var2
SQLINTEGER param2[5] = {0,0,0,0,0};
...
cliRC = SQLPrepare( hstmt, "CALL testproc(?,?)", SQL_NTS );
cliRC = SQLBindParameter( hstmt,
1,
SQL_PARAM_INPUT,
SQL_C_LONG,
SQL_INTEGER,
0, 0,
param1, ...);
cliRC = SQLBindParameter( hstmt,
2,
SQL_PARAM_OUTPUT,
SQL_C_LONG,
SQL_INTEGER,
0, 0,
param2, ...);
// Specify batching array size of 5
cliRC = SQLSetStmtAttr( hstmt,
SQL_ATTR_PARAMSET_SIZE,
(SQLPOINTER) 5,
SQL_IS_INTEGER );
// The single SQLExecute() will be equivalent to making five CALL statements
cliRC = SQLExecute( hstmt );
// Print values of param2 used for OUTPUT type
for (i=0; i<5; i++)
{
printf (“param2[%d] = %d¥n”, i, param2[i]);
}
以下に、複数の結果セットを返すストアード・プロシージャーに対してバッチ CALL ステートメントを実行する例を示します。CREATE PROCEDURE testproc (IN var1 INTEGER)
LANGUAGE SQL
BEGIN
INSERT INTO myTable VALUES (var1);
DECLARE CURSOR c1 ...
DECLARE CURSOR c2 ...
DECLARE CURSOR c3 ...
OPEN c1 ...
OPEN c2 ...
OPEN c3 ...
END
SQLINTEGER param1[5] = {1,2,3};
...
cliRC = SQLPrepare( hstmt, "CALL testproc(?)", SQL_NTS );
cliRC = SQLBindParameter( hstmt,
1,
SQL_PARAM_INPUT,
SQL_C_LONG,
SQL_INTEGER,
0, 0,
param1, ...);
// Specify batching array size of 3
cliRC = SQLSetStmtAttr( hstmt,
SQL_ATTR_PARAMSET_SIZE,
(SQLPOINTER) 3,
SQL_IS_INTEGER );
// The single SQLExecute() will be equivalent to making five CALL statements
cliRC = SQLExecute( hstmt );
//Sequentially Fetch all result sets opened by cursors
//Start with first result-set
while ((cliRC = SQLFetch(hstmt)) != SQL_NO_DATA_FOUND)
{ // Take some action }
//Done with 1st result set. Move on to next result set
cliRC=SQLMoreResults(hstmt);
//Start with 2nd result set
while ((cliRC = SQLFetch(hstmt)) != SQL_NO_DATA_FOUND)
{ // Take some action }
//Done with 2nd result set. Move on to next result set
cliRC=SQLMoreResults(hstmt);
//Start with 3rd result set
while ( (cliRC = SQLFetch(hstmt)) != SQL_NO_DATA_FOUND)
{ // Take some action }
...