Java callableStatement, выдающий ошибку: попытка установить имя параметра, которое не встречается в SQL

Я хочу выполнить хранимую процедуру Oracle, используя именованный параметр из Java CollableStatement. Синтаксически все хорошо, когда мы выполняем приложение, мы получаем SQL Error-

Java-код -

int method1(){
  CallableStatement stmt stmt = connection.prepareCall("{call "+strSQL.toString()+"}");
  sp_copy_my_tree(?,?,?)
  stmt.setInt("src_cd_ekey", 2057);
  stmt.setInt("trg_ef_ekey", 8222);
  stmt.setInt("trg_display_order", 1]);

  returnValue = stmt.executeUpdate(strSQL.toString());
  return returnValue ;
}

Хранимая процедура Oracle -

create or replace PROCEDURE  sp_copy_my_tree (src_ab_ekey IN NUMBER DEFAULT NULL, 
src_cd_ekey IN NUMBER DEFAULT NULL, trg_ef_ekey IN NUMBER DEFAULT NULL, 
trg_gh_ekey IN NUMBER DEFAULT NULL, trg_display_order IN NUMBER) 
IS
begin 
  --- Some PL/SQL code ---
END ;

Когда я выполняю вышеприведенный оператор Java, я получаю исключение -

* java.sql.SQLException: попытка установить имя параметра, которое не встречается в SQL: src_cd_ekey*

Примечание. Я также попытался передать все параметры в том же порядке, где для других двух параметров я передал значение NULL. Но все равно получаю то же исключение.

Пожалуйста, кто-нибудь, помогите нам решить эту проблему.

2 ответа

Эта проблема возникла по двум причинам.

1) Число параметров, объявленных в Процедуре, отличается от количества параметров, переданных из вызова процедуры Java. Это причина, по которой удачно предоставленный Ответ 1, к этой теме не может быть использован как есть. Нам нужно передать все 5 параметров из вызова процедуры в правильной последовательности.

2) Именованный параметр в Java отличается от именованного параметра Oracle.

В Oracle мы можем выполнить процедуру, передавая только выбранные параметры, поскольку передаваемые параметры могут не соответствовать правильной последовательности, поэтому значения могут быть связаны с именем параметра (в качестве ключа). пример -

    EXEC sp_copy_my_tree (src_cd_ekey=>2057, trg_ef_ekey=>8222, trg_display_order=>1);

В Java мы не можем эмулировать это, и именованный параметр java имеет другое значение. В выражении java мы можем указать имя параметра, начинающееся с двоеточия, вместо использования? в качестве заполнителя. Позже при настройке заполнителя мы можем использовать эти имена параметров, а не индексировать. Пример -

    CallableStatement stmt stmt = connection.prepareCall( "{call sp_copy_my_tree(:src_cd_ekey,:trg_ef_ekey, :trg_display_order)}");

    stmt.setInt("src_cd_ekey", 2057);
    stmt.setInt("trg_ef_ekey", 8222);
    stmt.setInt("trg_display_order", 1]);

Но этот вызов Oracle будет рассматриваться как запрос на выполнение процедуры с первыми 3 параметрами.

Примечание: я получаю SqlException с stmt.executeUpdate(), поэтому я использовал stmt.execute(). Это может быть проблемой в моей реализации, но последний работал в моем случае.

Попробуйте этот метод:

CallableStatement stmt = connection.prepareCall("{call sp_copy_my_tree (?,?,?}");
  stmt.setInt(1, 2057);
  stmt.setInt(2, 8222);
  stmt.setInt(3, 1);

  returnValue = stmt.executeUpdate();
  return returnValue ;
}

Подробности смотрите в документации: http://docs.oracle.com/cd/E11882_01/java.112/e16548/getsta.htm

Другие вопросы по тегам