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