Вам необходимо вызывать хранимую процедуру в виде строки запроса либо в формате Oracle, либо в стандартном синтаксисе оператора вызова JDBC.
Последний блок кода, начинающийся с DECLARE ..
, не требуется, достаточно использовать хранимую процедуру findStudentByname
.
Предпочитайте использовать REGEXP_LIKE
как
OPEN c_student FOR SELECT * FROM STUDENT WHERE REGEXP_LIKE(NAME,p_name,'i')
.
против проблем чувствительности к регистру для оператора SQL.
По формат Oracle :
private void findStudent(String name)
throws SQLException {
String qry = "begin ? := findStudentByName(?); end;";
//presuming you already constructed an Oracle connection such as
// Class.forName("oracle.jdbc.OracleDriver");
//con = DriverManager.getConnection("jdbc:oracle:thin:@//"+dbname,uname,passwd);
CallableStatement stmt = con.prepareCall(qry);
// the out parameter should be registered as Oracle specific type
stmt.registerOutParameter(1, OracleTypes.CURSOR);
stmt.setFloat(2, name); //pass your filtering parameter
// execute and retrieve the result set
stmt.execute();
ResultSet rs = (ResultSet)stmt.getObject(1);
// print out the results
while (rs.next()) {
System.out.println("STUDENT_ID : "+rs.getLong(1));
System.out.println("NAME : "+rs.getString(2));
System.out.println("SURNAME : "+rs.getString(3));
System.out.println("BIRTH_DATE : "+rs.getDate(4));
}
rs.close();
stmt.close();
}
По Синтаксис JDBC :
private void findStudent(String name)
throws SQLException {
String qry = "{ call ? := findStudentByName(?) }";
CallableStatement stmt = con.prepareCall(qry);
stmt.registerOutParameter("out_crs", OracleTypes.CURSOR);
stmt.setFloat("in_st_name", name);
stmt.execute();
ResultSet rs = (ResultSet)stmt.getObject("out_crs");
while (rs.next()) {
System.out.println("STUDENT_ID : "+rs.getLong("student_id"));
System.out.println("NAME : "+name);
System.out.println("SURNAME : "+rs.getString("surname"));
System.out.println("BIRTH_DATE : "+rs.getDate("birth_date"));
}
rs.close();
stmt.close();
}