組み込みのルーチンおよびビューをアプリケーションで呼び出す場合のベスト・プラクティス

組み込みルーチンおよびビューを適切に使用できるようにするために、特定のコーディング手法が推奨されています。 ルーチンはリリースによって変わることがあり、また機能拡張が行われるとフィックスパックなどでリリース内でも変わる可能性があるため、これらの手法は特に重要です。

組み込みルーチンまたはビューを使って情報を取得するために照会を発行するとき、ワイルドカードを使用してすべての列を選択せずに、特定の列を選択してください。例えば、次のような照会を発行しないでください。

SELECT * FROM TABLE(MON_GET_UNIT_OF_WORK(NULL,-1)) AS t 
ORDER BY total_cpu_time DESC
その代わりに、SELECT ステートメントで結果列を指定します。 この手法を使用すると、結果列の数とそれらが戻される順序をアプリケーションが制御できるようになります。 前の照会を書き直した次の照会では、列が指定されます。
SELECT application_handle, 
       uow_id, 
       total_cpu_time, 
       app_rqsts_completed_total, 
       rqsts_completed_total 
FROM TABLE(MON_GET_UNIT_OF_WORK(NULL,-1)) AS t 
ORDER BY total_cpu_time DESC

列を指定することで、ルーチン内の列の順序や数が変わる場合の問題を防ぐことができます。 ルーチンが戻す結果列の数が増えることがあります。 例えば、ルーチンが 6 つの結果列を戻すときにホスト変数を 5 つしか指定していなければ、アプリケーションは中断してしまいます。

さらに、ルーチンの出力パラメーターまたは結果列のタイプやサイズが変わることもあります。 例えば、列が VARCHAR(8) から VARCHAR(128) に変わったり、INTEGER 列が BIGINT 列になったりすることがあります。 使用する変数が小さすぎる場合は、ルーチンから受け取るデータが切り捨てられる可能性があります。

このような変化から C アプリケーションを保護するために、準備済み (PREPARE) ステートメントを記述 (DESCRIBE) することにより、戻される結果列とそのタイプおよびサイズを判別できます。 次の例は、準備済みステートメントを記述する方法を示しています。
strcpy(strStmt, "SELECT application_handle, uow_id,total_cpu_time 
   FROM TABLE(MON_GET_UNIT_OF_WORK(NULL,-1)) 
   AS t ORDER BY total_cpu_time DESC");
EXEC SQL PREPARE stmt FROM :strStmt;
EXEC SQL DESCRIBE stmt into :*pSqlda;

戻される情報を SQL 記述子域 (SQLDA) で使用する方法の例については、samples/c/tbread.sqc ファイルにある RowDatamemoryAlloc 関数を参照してください。

Java™ および .NET アプリケーションの場合は、プログラムのデータ・タイプおよびサイズを知る必要があります。次の例に示すように、メタデータを使用することにより、戻される結果列とそのタイプおよびサイズを判別できます。

ResultSet rs = pstmt.executeQuery();
ResultSetMetaData rsms = rs.getMetaData();
結果セットのメタデータを使用する方法の例については、samples/java/jdbc/TbRead.java ファイルにある execPreparedQueryWithUnknownOutputColumn( ) メソッドを参照してください。