ステートメントオブジェクトを介したSQLステートメントの実行¶
Advanced Server JDBC Connectorドライバーをロードしてサーバーに接続した後、サンプルアプリケーションのコードはJDBC Statementオブジェクトを構築し、SQLクエリを実行し、結果を表示します。
Statementオブジェクトは、SQLステートメントをデータベースに送信します。 Statementオブジェクトには3種類あります。それぞれが特定のタイプのSQLステートメントを送信するために特化されています。
-
Statementオブジェクトは、パラメーターなしで単純なSQLステートメントを実行するために使用されます。 -
PreparedStatementオブジェクトは、INパラメーターを使用して、または使用せずに、プリコンパイルされたSQLステートメントを実行するために使用されます。 -
CallableStatementオブジェクトは、データベースストアドプロシージャの呼び出しを実行するために使用されます。
SQLステートメントを実行する前に、 Statementオブジェクトを作成する必要があります。 Statementオブジェクトは、SQLステートメントをサーバーに送信する(および結果セットにアクセスする)方法を提供します。各StatementオブジェクトはConnection属します。 createStatement()メソッドを使用して、 ConnectionにStatementオブジェクトの作成を依頼します。
Statementオブジェクトは、さまざまなタイプのSQLステートメントを実行するためのいくつかのメソッドを定義します。サンプルアプリケーションでは、 executeQuery()メソッドがSELECTステートメントを実行します。
Statement stmt = con . createStatement ();
ResultSet rs = stmt . executeQuery ( "SELECT * FROM emp" );
executeQuery()メソッドには、実行するSQLステートメントという1つの引数が必要です。 executeQuery()は、 ResultSetオブジェクトのクエリからデータを返します。指定されたSQLステートメントの実行中にサーバーでエラーが発生した場合、サーバーはSQLExceptionスローします(そしてResultSet返しません)。
CallableStatementオブジェクトで名前付き表記を使用する¶
JDBCコネクター(Advanced Serverバージョン9.6以降)は、 CallableStatementオブジェクトをインスタンス化する際に名前付きパラメーターの使用をサポートします。この構文は、JDBCがサポートする構文の拡張であり、JDBC標準に準拠していません。
CallableStatementオブジェクトを使用して、パラメータ値をストアドプロシージャに渡すことができます。 CallableStatementオブジェクトを使用して、 IN 、 OUT 、およびINOUTパラメーターに値を割り当てることができます。
CallableStatementクラスを使用する場合、序数表記または名前表記を使用して、実際の引数の値を指定できます。ステートメントの各INまたはINOUTパラメーターマーカーに値を設定する必要があります。
序数表記を使用してCallableStatementオブジェクトに値を渡す場合、に対応するsetterメソッドを使用する必要があります
パラメータタイプ。たとえば、 STRING値を渡す場合は、 setString setterメソッドを使用します。ステートメント( ? )内の各パラメーターマーカーは、序数値を表します。順序パラメータを使用する場合、プロシージャ定義内で仮引数が指定されている順序で、実際のパラメータ値をステートメントに渡す必要があります。
CallableStatementオブジェクトの引数値を指定するときに、名前付きパラメーター表記を使用することもできます。名前付きパラメーター表記法を使用すると、プロシージャに必要なパラメーターのみに値を指定でき、受け入れ可能なデフォルト値を持つパラメーターは省略できます。名前付きパラメーターを任意の順序で指定することもできます。
名前付き表記を使用する場合、各パラメーター名はDatabaseMetaData.getProcedureColumnsメソッドの呼び出しによって返されるCOLUMN_NAMEに対応する必要があります。ステートメント呼び出しに名前付きパラメーターを含める場合は、 =>トークンを使用する必要があります。
registerOutParameterメソッドを使用して、ステートメント内の各OUTまたはINOUTパラメーターマーカーを識別します。
例
次の例は、 CallableStatementメソッドを使用して、次のシグネチャを持つプロシージャにパラメーターを提供する方法を示しています。
PROCEDURE hire_emp ( ename VARCHAR2
empno NUMBER
job VARCHAR2
sal NUMBER
hiredate DATE DEFAULT now (),
mgr NUMBER DEFAULT 7100 ,
deptno NUMBER
)
次の例では、序数表記を使用してパラメーターを提供しています。
CallableStatement cstmt = con . prepareCall
( "{CALL hire_emp(?,?,?,?,?,?,?)}" );
// Bind a value to each parameter .
cstmt . setString ( 1 , "SMITH" );
cstmt . setInt ( 2 , 8888 );
cstmt . setString ( 3 , "Sales" );
cstmt . setInt ( 4 , 5500 );
cstmt . setDate ( 5 , "2016-06-01" );
cstmt . setInt ( 6 , 7566 );
cstmt . setInt ( 7 , 30 );
次の例では、名前付き表記を使用してパラメーターを提供しています。名前付き表記を使用すると、デフォルト値を持つパラメーターを省略したり、パラメーターを並べ替えることができます。
CallableStatement cstmt = con . prepareCall
( "{CALL hire_emp(ename => ?,
job => ?,
empno => ?,
sal => ?,
deptno => ?
)}」); // 各 パラメータ に 値を バインド cstmt setStringの ( "ENAME"、 "SMITH")。cstmt にsetInt( "EMPNO"、8888); cstmt setStringの ( "ジョブ"、 "販売") ; cstmt にsetInt( "SAL"、5500)。cstmt にsetInt( "DEPTNO"、30)。 