JDBC CallableStatement - пример КУРСОРА хранимой процедуры
Пример JDBCCallableStatement для вызова хранимой процедуры, возвращающей курсор.
Протестировано с Java 8 и базой данных Oracle 19c
pom.xml
com.oracle ojdbc 8 system path.to/ojdbc8.jar
1. JDBC CallableStatement
1.1 A PL/SQL stored procedure which returns a cursor.
CREATE OR REPLACE PROCEDURE get_employee_by_name(
p_name IN EMPLOYEE.NAME%TYPE,
o_c_dbuser OUT SYS_REFCURSOR)
AS
BEGIN
OPEN o_c_dbuser FOR
SELECT * FROM EMPLOYEE WHERE NAME LIKE p_name || '%';
END;
1.2 JDBC example to call above stored procedure.
StoreProcedureCursor.java
package com.example.jdbc.callablestatement;
import com.example.jdbc.model.Employee;
import oracle.jdbc.OracleTypes;
import java.math.BigDecimal;
import java.sql.*;
public class StoreProcedureCursor {
public static void main(String[] args) {
String createSP = "CREATE OR REPLACE PROCEDURE get_employee_by_name( "
+ " p_name IN EMPLOYEE.NAME%TYPE, "
+ " o_c_dbuser OUT SYS_REFCURSOR) "
+ " AS "
+ " BEGIN "
+ " OPEN o_c_dbuser FOR "
+ " SELECT * FROM EMPLOYEE WHERE NAME LIKE p_name || '%'; "
+ " END; ";
String runSP = "{ call get_employee_by_name(?,?) }";
try (Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:orcl", "system", "Password123");
Statement statement = conn.createStatement();
CallableStatement cs = conn.prepareCall(runSP);
) {
//conn.setAutoCommit(false);
// create function
statement.execute(createSP);
cs.setString(1, "mk");
// alternative
//cs.registerOutParameter(2, Types.REF_CURSOR);
cs.registerOutParameter(2, OracleTypes.CURSOR);
// run SP
cs.execute();
// get refcursor and convert it to ResultSet
ResultSet resultSet = (ResultSet) cs.getObject(2);
while (resultSet.next()) {
long id = resultSet.getLong("ID");
String name = resultSet.getString("NAME");
BigDecimal salary = resultSet.getBigDecimal("SALARY");
Timestamp createdDate = resultSet.getTimestamp("CREATED_DATE");
Employee obj = new Employee();
obj.setId(id);
obj.setName(name);
obj.setSalary(salary);
// Timestamp -> LocalDateTime
obj.setCreatedDate(createdDate.toLocalDateTime());
System.out.println(obj);
}
} catch (SQLException e) {
System.err.format("SQL State: %s\n%s", e.getSQLState(), e.getMessage());
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Скачать исходный код
$ git clone https://github.com/example/java-jdbc.git