JavaとPLSQLのselectで複数件取得するサンプルです。
PLSQLでREF CURSORを使用します。
(確認環境:Java 8,Oracle Express Edition 11g,Windows 10)
目次
コード | Javaのコード |
PLSQL | PLSQLの仕様部 |
PLSQLの本体部 |
Javaのコード
package test1;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import oracle.jdbc.OracleTypes;
public class Test1 {
public static void main(String[] args) {
final String URL = "jdbc:oracle:thin:@localhost:1521:XE";
final String USER = "hr";
final String PASS = "hr";
final String SQL = "{call TEST_EMPLOYEE_INFO.GET_EMPLOYEE_INFO(?,?)}";
try (Connection conn = DriverManager.getConnection(URL, USER, PASS);
CallableStatement cs = conn.prepareCall(SQL)) {
cs.setInt(1, 2);
cs.registerOutParameter(2, OracleTypes.CURSOR);
cs.execute();
ResultSet rs =(ResultSet) cs.getObject(2);
while (rs.next()) {
System.out.println(rs.getInt("id") +
rs.getString("name") +
rs.getString("romaji"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
13行目は、オラクルへ接続する情報です。1521はポート番号でデフォルトの値です。XEはデータベース名です。
16行目は、使用するPLSQLのプロシージャ名です。引数はINとOUTの2つがあるので?が2つになっています。
21行目は、1つ目の引数です。
22行目は、2つ目の引数です。OUTの引数でCURSORとなっています。
24行目は、PLSQLのプロシージャを実行します。
25行目のgetObjectの引数は列数です。列は0からカウントします。
26~30行目は取得した値を表示しています。
PLSQLの仕様部
PLSQLの仕様部のコードです。
CREATE OR REPLACE PACKAGE TEST_EMPLOYEE_INFO
IS
/*
* REF CURSORのテスト用
*/
TYPE CURSOR IS REF CURSOR;
PROCEDURE GET_EMPLOYEE_INFO(
ID1 IN number,
CURSOR1 OUT CURSOR
);
END;
6行目は、REF CURSORを定義しています。
10行目は、変数CUROSOR1は、CURSOR型でOUTと定義しています。
PLSQLの本体部
PLSQLの本体部のコードです。
CREATE OR REPLACE PACKAGE BODY TEST_EMPLOYEE_INFO
IS
/*
* REF CURSORのテスト用
*/
PROCEDURE GET_EMPLOYEE_INFO
(
ID1 IN number,
CURSOR1 OUT CURSOR
)
IS
BEGIN
OPEN CURSOR1 FOR
select id,name,romaji from EMPLOYEE
-- where ID = ID1
order by id;
END;
END;
14行目のSQLの実行結果が13行目のCURSOR1にセットされます。
9行目でCURSOR1はOUTなので結果を返します。
15行目の条件をコメントにしているので全件返します。
コメントを外せば指定したIDのデータのみ返します。
カーソルのcloseは入れていません。入れるとJava側で値を取得できなくなります。
関連の記事