ステートメントオブジェクトによるSQLステートメントの実行¶
AdvancedServerJDBCConnectorドライバーを読み込んでサーバーに接続した後、サンプルアプリケーションのコードはJDBC Statement オブジェクトを構築し、SQLクエリを実行し、結果を表示します。
Statement オブジェクトはSQLステートメントをデータベースに送信します。Statementオブジェクトには3種類あります。それぞれが特定のタイプのSQLステートメントを送信するために特化されています。
Statementオブジェクトは、パラメーターなしで単純なSQLステートメントを実行するために使用されます。PreparedStatementオブジェクトは、INパラメーターの有無にかかわらず、プリコンパイルされたSQLステートメントを実行するために使用されます。CallableStatementオブジェクトは、データベースストアドプロシージャの呼び出しを実行するために使用されます。
You must construct a Statement object before executing an SQL statement.
The Statement object offers a way to send a SQL statement to the server
(and gain access to the result set). Each Statement object belongs to a
Connection; use the createStatement() method to ask the Connection to
create the Statement object.
Statement オブジェクトは、さまざまなタイプのSQLステートメントを実行するためのいくつかのメソッドを定義します。サンプルアプリケーションでは、 executeQuery() メソッドは SELECT ステートメントを実行します:
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM emp");
The executeQuery() method expects a single argument: the SQL statement
that you want to execute. executeQuery() returns data from the query in
a ResultSet object. If the server encounters an error while executing
the SQL statement provided, it throws an SQLException (and does not
return a ResultSet).
CallableStatementオブジェクトで名前付き表記を使用する¶
JDBCコネクター(AdvancedServerバージョン9.6以降)は、 CallableStatement オブジェクトをインスタンス化する際に名前付きパラメーターの使用をサポートします。この構文は、JDBCがサポートする構文の拡張であり、JDBC標準に準拠していません。
You can use a CallableStatement object to pass parameter values to a
stored procedure. You can assign values to IN, OUT, and INOUT parameters
with a CallableStatement object.
CallableStatement クラスを使用する場合、序数表記または名前表記を使用して、実際の引数の値を指定できます。ステートメント内の各 IN または INOUT パラメーターマーカーの値を設定する必要があります。
序数表記を使用して CallableStatement オブジェクトに値を渡す場合、パラメーターの型に対応するセッターメソッドを使用する必要があります。たとえば、 STRING 値を渡すときは、 setString セッターメソッドを使用します。ステートメント( ? )内の各パラメーターマーカーは順序値を表します。順序パラメータを使用する場合は、プロシージャ定義内で仮引数が指定されている順序で、実際のパラメータ値をステートメントに渡す必要があります。
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 => ?
)}");
//Bind a value to each parameter.
cstmt.setString("ename", "SMITH");
cstmt.setInt("empno", 8888);
cstmt.setString("job", "Sales");
cstmt.setInt("sal", 5500);
cstmt.setInt("deptno", 30);