Java外部ストアド プロシージャでのSQLの実行 - Teradata Database - Teradata Vantage NewSQL Engine

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

Product
Teradata Database
Teradata Vantage NewSQL Engine
Release Number
16.20
Published
2019年3月
Language
日本語
Last Update
2019-10-29
dita:mapPath
ja-JP/uhh1512082756414.ditamap
dita:ditavalPath
ja-JP/uhh1512082756414.ditaval
dita:id
B035-1147
Product Category
Software
Teradata Vantage

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

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

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

接続の確立

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

デフォルト接続は、外部ストアド プロシージャが実行されているセッションに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文のみを実行できます。

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

例外を受け取った際の外部ストアド プロシージャの状況 トリガーされるリクエストが終了した後の動作
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://developer.teradata.com/connectivity/reference/jdbc-driverから入手可能)

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