именованный параметр не проходит правильно в jdbc - PullRequest
0 голосов
/ 04 июля 2019

Я вызываю процедуру с именованным параметром, используя JDBC CallableStatement.

Процедура:

create or replace PROCEDURE VIST_COMP(I_STUDY IN VARCHAR2, I_STARTDATE IN VARCHAR2, I_ENDDATE IN VARCHAR2, I_EMPLOYEE IN VARCHAR2, I_EMPLOYEE_OPTIONAL IN NUMBER, I_SPONSOR IN VARCHAR2, I_SPONSOR_OPTIONAL IN NUMBER, p_rc OUT SYS_REFCURSOR)
AS
o_cursor SYS_REFCURSOR;
sqlqry clob;
BEGIN
  //procedure code 
END VIST_COMP;

Java-код:

String runSP = "call VIST_COMP(:protocols,:alertStartDate,:alertEndDate,:employee,:employeeOptional,:sponsor,:sponsorOptional, :out_cursor)";         
try (Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:localhost:389/oracle", "username", "password");
CallableStatement callableStatement = conn.prepareCall(runSP)) {
   callableStatement.setString("protocols","12345");
   callableStatement.setString("alertStartDate", "03-Apr-2019");
   callableStatement.setString("alertEndDate", "03-Jun-2019");
   callableStatement.setString("employee",null);
   callableStatement.setInt("employeeOptional",1);
   callableStatement.setString("sponsor", "abc");
   callableStatement.setInt("sponsorOptional",0);

   callableStatement.registerOutParameter("out_cursor", OracleTypes.CURSOR);

   // run it
   callableStatement.execute();
   ResultSet rset = (ResultSet)   callableStatement.getObject("out_cursor");

   while(rset.next()) {
     System.out.println(rset.getString("LABEL_VALUE"));
   }
}catch(Exception e) {
   e.printStackTrace();
}

Над кодом работает хорошо, и я также получил ResultSet. Но проблема в том, что если я изменю порядок параметров набора, он не работает. Например, если я установил sponsor выше даты, как показано ниже, выдав ошибку.

callableStatement.setString("protocols","12345");
callableStatement.setString("alertStartDate", "03-Apr-2019");
callableStatement.setString("sponsor", "abc");
callableStatement.setString("alertEndDate", "03-Jun-2019");
callableStatement.setString("employee",null);
callableStatement.setInt("employeeOptional",1);
callableStatement.setInt("sponsorOptional",0);

Ошибка БД

ORA-01858: был найден нечисловой символ, где числовой ожидается

ORA-06512: в "VIST_COMP", строка 266

Использование пути сборки Java 1.7 (установлен JDK 1.8), Oracle 12c, Ojdbc6.jar.

...