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を送付します。
- 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 |