17.00 - 17.05 - 動的な結果セットを戻す - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQL外部ルーチン プログラミング

Product
Advanced SQL Engine
Teradata Database
Release Number
17.00
17.05
Published
2020年6月
Content Type
プログラミング リファレンス
Publication ID
B035-1147-170K-JPN
Language
日本語 (日本)

外部ストアド プロシージャのCREATE PROCEDURE文またはREPLACE PROCEDURE文がDYNAMIC RESULT SETS句を指定する場合、(結果セット自身の消費に加え)外部ストアド プロシージャでその完了時にクライアント アプリケーションまたは外部ストアド プロシージャの呼び出し側に結果セットを戻すことができます。

結果セットとは、外部ストアド プロシージャが実行する次のいずれかの文の結果として得られる行のセットです。

  • SELECT
  • HELP TABLE
  • HELP VIEW
  • HELP MACRO
  • SHOW TABLE
  • SHOW VIEW
  • SHOW MACRO
  • COMMENT

外部ストアド プロシージャでは、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つのスプール ファイルを生成する必要があります。