Java PLSQLのselectで複数件取得する

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側で値を取得できなくなります。

関連の記事

Java Oracleに接続してselectするサンプル

△上に戻る