17.00 - 17.05 - Java外部ストアド プロシージャでのSQLの実行 - 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
日本語 (日本)

Java外部ストアド プロシージャでは、JDBCを使用してデータベースへのデフォルトの接続を確立し、SQLを直接実行することができます。

Java外部ストアドプロシージャ内のSQL文がSTRUCTURED型UDT、Period型データまたはARRAY型データにアクセスする場合、値はリクエストに対しオプション パーセルで設定されるUDTTransformsOff、PeriodStructOn、およびArrayTransformsOffフラグに基づいて返されます。

この節では、Java外部ストアド プロシージャでJDBCを使用してSQLを実行する方法について説明します。また、Java外部ストアド プロシージャからTeradata Databaseにアクセスする場合と、Javaアプリケーションからデータベースにアクセスする場合の違いについて説明します。Teradata JDBCインターフェース ドライバを使用してデータベースにアクセスする方法については、Teradata JDBC Driverの参考文献(https://teradata-docs.s3.amazonaws.com/doc/connectivity/jdbc/reference/current/frameset.htmlから入手可能)を参照してください。

接続の確立

Java外部ストアド プロシージャがSQLを実行する前に、"jdbc:default:connection"をjava.sql.DriverManager.getConnection()メソッドに渡して、データベースへのデフォルトの接続を確立しなければなりません。

デフォルト接続は、外部ストアド プロシージャが実行されているセッションにSQLを送付します。

DriverManager.getConnection()を正常に呼び出してTeradata JDBC Driverにアクセスするには、CREATE PROCEDUREまたはREPLACE PROCEDURE文に、以下のいずれかのデータ アクセス句を指定する必要があります。
  • CONTAINS SQL
  • READS SQL DATA
  • MODIFIES SQL DATA

これらのデータ アクセス句の詳細について、プロシージャが実行するSQL文の型の制限を参照してください。

上記のデータ アクセス句のいずれかを省略するか、CREATE PROCEDUREまたはREPLACE PROCEDURE文でNO SQL句を指定すると、Java外部ストアド プロシージャのクラス パスでTeradata JDBC Driverが利用できなくなります。DriverManager getConnectionメソッドを呼び出してTeradata JDBC Driverにアクセスしようとすると、「適合ドライバがない」ことを示す例外が発生します。

例: Teradata Databaseとのデフォルトの接続の確立

public class region {

   public static void getRegion(String[] data) throws SQLException
   {
      String sql = "SELECT Region FROM Sales WHERE ID = ";
      try {
         /* Establish default connection. */
         Connection con = 
            DriverManager.getConnection( "jdbc:default:connection " ); 
         /* Execute the statement */
         Statement stmt = con.createStatement();
         ResultSet rs = stmt.executeQuery( sql + data[0] );
         rs.next();
         data[0] = rs.getString("Region");
         stmt.close();
      }
      catch (Exception e) {
         throw new SQLException(e.getMessage(),"38U01");
      }
   }

   ...

}

プロシージャが実行するSQL文の型の制限

外部ストアド プロシージャ(およびストアド プロシージャ)が実行可能なSQL文の型は、CREATE PROCEDURE文またはREPLACE PROCEDURE文で指定されるデータ アクセス句によって制限されます。

CREATE PROCEDUREまたはREPLACE PROCEDURE文での指定 外部ストアド プロシージャ
CONTAINS SQL データベースでSQLデータを読み込んだり変更することはできませんが、CALLなどのSQL制御文を実行できます。
READS SQL DATA SQLデータを変更することはできませんが、SQLデータを読み込むSELECTなどの文を実行できます。
MODIFIES SQL DATA SQLデータを読み込んだり変更するSQL文を実行できます。
外部ストアド プロシージャまたはストアド プロシージャは、呼び出しに使用された、最も制限されたプロシージャのアクセス句に対応する文のみを実行できます。 例えば、以下のような場合について考えてみます。
  • CREATE PROCEDURE文がCONTAINS SQLのデータ アクセス句を指定するJava外部ストアド プロシージャ。
  • CREATE PROCEDURE文がMODIFIES SQL DATAのデータ アクセス句を指定するストアド プロシージャ。

外部ストアド プロシージャがストアド プロシージャを呼び出す場合、呼び出し側は既にCONTAINS SQLデータ アクセス句によって制限されているため、ストアド プロシージャは制御文のみを実行できます。

例: SQLデータを読み取る外部ストアド プロシージャ

以下の文は、READS SQL DATAデータ アクセス句を指定します。これは、GetRegion外部ストアド プロシージャ(例: Teradata Databaseとのデフォルトの接続の確立を参照)を実装するgetRegion()メソッドがSELECT文を実行するためです。

CREATE PROCEDURE GetRegion(INOUT Str VARCHAR(120))
   LANGUAGE JAVA
   READS SQL DATA
   PARAMETER STYLE JAVA
   EXTERNAL NAME 'JarXSP:region.getRegion';

トリガーから起動された場合にプロシージャが実行可能な文

トリガーが発生した際に呼び出される外部ストアド プロシージャでは、トリガーされたアクションの文として許可されるSQL文のみを実行できます。

他の文を実行しようとすると、データベースによって外部ストアド プロシージャに例外が戻されます。このような例外を受け取る外部ストアド プロシージャでは、エラーを通知して、外部ファイルを閉じるか、確立した接続を切断することができます。アクションは、戻ることしかできません。

例外を受け取った際の外部ストアド プロシージャの状況 トリガーされるリクエストが終了した後の動作
SQLExceptionをスローし、SQLStateフィールドを独自の例外コードに設定して、独自のエラーを戻す 元のエラーの状況は、外部ストアド プロシージャの呼び出し側には通知されません。
SQLExceptionをスローしない システムは元のエラーを呼び出し側に戻します。
別のリクエストを実行しようとする 7836エラーが生成されます。 XSP db.nameが、トリガー エラー メッセージを受け取った後にリクエストを実行しました。

トリガーされたアクションの文として許可されるSQL文のリストと詳細については、<Teradata Vantage™- SQLデータ定義言語 - 詳細トピック、B035-1184>の「CREATE TRIGGER」を参照してください。

制限

SQLを実行するJava外部ストアド プロシージャをマルチスレッド化することはできません。

関連トピック

詳細情報 参照先
CREATE PROCEDURE Teradata Vantage™ - SQLデータ定義言語-構文規則および例、B035-1144
REPLACE PROCEDURE
CONTAINS SQL、READS SQL DATA、およびMODIFIES SQL DATAデータ アクセス句
Teradata JDBCインターフェース ドライバの使用

Teradata JDBC Driverの参考文献(https://teradata-docs.s3.amazonaws.com/doc/connectivity/jdbc/reference/current/frameset.htmlから入手可能)

UDTTransformsOff、PeriodStructOnおよびArrayTransformsOffフラグ Teradata Vantage™ - データ タイプおよびリテラル、B035-1143