外部ストアド プロシージャのCREATE PROCEDURE文またはREPLACE PROCEDURE文がDYNAMIC RESULT SETS句を指定する場合、(結果セット自身の消費に加え)外部ストアド プロシージャでその完了時にクライアント アプリケーションまたは外部ストアド プロシージャの呼び出し側に結果セットを戻すことができます。
結果セットとは、外部ストアド プロシージャが実行する次のいずれかの文の結果として得られる行のセットです。
|
|
外部ストアド プロシージャでは、DYNAMIC RESULT SETS句の指定に応じて、結果セットを15個まで返すことができます。
Javaメソッドのシグネチャ
外部ストアド プロシージャを実装するJavaメソッドのシグネチャには、IN、INOUT、およびOUTパラメータが含まれます。これらのパラメータの後には、n個のResultSet[]出力パラメータが続きます。ここで、nはDYNAMIC RESULT SETS句で指定された結果セットの数です。
実装
結果セットを戻すため、Java外部ストアド プロシージャはJDBCドライバのデフォルト接続を使用してTeradata Databaseへの接続を確立し、結果セットを生成するSQL文を実行し、Statement.getResultSet()を使用して結果セットを取得し、ResultSet[]出力パラメータの1つを使って結果セットを戻します。
Java外部ストアド プロシージャは、結果セットを取得するのに使用するStatementオブジェクトを閉じてはいけません。
Java外部ストアド プロシージャは、CREATE PROCEDURE文またはREPLACE PROCEDURE文のDYNAMIC RESULT SETS句で指定したのと同じ数の結果セットを戻すことができます。ただし、外部ストアド プロシージャが結果セットを戻すことは必須ではありません。結果セットの出力パラメータがNULLまたは初期化されていない場合は、何も戻されません。
Java外部ストアド プロシージャは、各結果セットを特定の行に配置できます。例えば、3つの結果セットを返す外部ストアド プロシージャでは、1つを3行目に、1つをn-1行目に、もう1つを最初の行に配置することができます。
例: 2つの結果セットを返す
次のサンプルは、2つの結果セットを戻すメソッドの例です。
/************************************************************** DDL for the Java external stored procedure: REPLACE PROCEDURE UsrCmd( Command VARCHAR(120) ) LANGUAGE JAVA READS SQL DATA PARAMETER STYLE JAVA DYNAMIC RESULT SETS 2 EXTERNAL NAME 'jUdfRs:jUdfRsExamples.UsrCmd'; **************************************************************/ public class jUdfRsExamples { public static void UsrCmd(String Command, ResultSet[] rs1, ResultSet[] rs2) throws SQLException { Connection con = DriverManager.getConnection( "jdbc:default:connection" ); Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); /* Execute user's command. */ if (stmt.execute( Command )) { /* Return the result set. */ rs1[0] = stmt.getResultSet(); } if ( stmt.getMoreResults(Statement.KEEP_CURRENT_RESULT)) { /* Get a second result set if needed. */ rs2[0] = stmt.getResultSet(); } } ... }
制限
- 外部ストアド プロシージャが結果セットを戻す文は、マルチステートメント リクエストの一部を使うことはできません。
- 結果セットからのBLOBまたはCLOBデータのインライン読み込みはサポートされていません。
- 呼び出し元の外部ストアド プロシージャは、呼び出されたストアド プロシージャにより作成された結果セットを、Java外部ストアド プロシージャの呼び出し側に戻すことはできません。可能なのはデータの消費のみです。(結果セットの消費についての詳細は、ストアド プロシージャの呼び出しによって作成される結果セットの消費を参照してください)。
パフォーマンスとリソースについて
結果セットの作成では、多くの時間とリソースを消費しますので、よく検討する必要があります。呼び出し側の環境(文字セットとホストを含む)は外部ストアド プロシージャの環境とは異なる場合があるので、データベースでは外部ストアド プロシージャが結果セットを作成する各文に対して2つのスプール ファイルを生成する必要があります。