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 |