ある程度のロジック量がある場合、JavaでSQLをちょこちょこ発行すると時間を要してしまいます。
DB側のロジックにまとめて処理してもらった方が効率的です。
・・・ということで、今回は、ストアドプロシージャを呼び出してみます。
CallableStatementを利用してストアドプロシージャを呼び出すサンプル
DBMS_xxxxシリーズの1つ。sleepプロシージャを呼び出して、10秒間スリーブしてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; public class CallableStmtOraTest { public static void main(String[] args) { try { new CallableStmtOraTest().execute(); }catch(Exception e) { e.printStackTrace(); } } public void execute() throws Exception { Connection conn = null; CallableStatement cstmt = null; //おまじないw(ドライバのロード) Class.forName("oracle.jdbc.driver.OracleDriver"); //DBに接続(URL,USER_ID,PASSWORD) conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "scott", "tiger"); //SQLを発行 cstmt = conn.prepareCall("call dbms_lock.sleep(?)"); cstmt.clearParameters(); cstmt.setInt(1, 10); cstmt.execute(); //後始末 cstmt.close(); conn.close(); } } |
実行結果
10秒間ストアドプロシージャ側で待ちます。
サンプルの解説
PreparedStatementの使い方とほぼ同じです。
Connection#prepareCall(String)で、プロシージャを指定します。
引数はPreparedStatement同様に、後からセットします。
ストアドプロシージャは、CallableStatement#execute()で実行します。
余談ですが、DBMS_LOCK.SLEEPは、そのままでは使えません。GRANTしてあげてくださいw