«Конфликт типа параметра» при вызове хранимой процедуры Java внутри другой хранимой процедуры Java - PullRequest
2 голосов
/ 06 апреля 2010

Вот проблема (извините за плохой английский):

Я работаю с JDeveloper и Oracle10g, и у меня есть хранимая процедура Java, которая вызывает другой JSP, такой как код:

int sd = 0;

try {
  CallableStatement clstAddRel = conn.prepareCall(" {call FC_RJS_INCLUIR_RELACAO_PRODCAT(?,?)} ");
  clstAddRel.registerOutParameter(1, Types.INTEGER);
  clstAddRel.setString(1, Integer.toString(id_produto_interno));
  clstAddRel.setString(2, ac[i].toString());
  clstAddRel.execute();

  sd = clstAddRel.getInt(1);
} catch(SQLException e) {
  String sqlTeste3 = "insert into ateste values (SQ_ATESTE.nextval, ?)";

   PreparedStatement pstTeste3 = conn.prepareStatement(sqlTeste3);
   pstTeste3.setString(1,"erro: "+e.getMessage()+ ac[i]);
   pstTeste3.execute();
   pstTeste3.close();
}

Я записываю ошибку в таблицу под названием ATESTE, потому что этот JavaSP является процедурой, а не функцией, я должен манипулировать DML внутри.

Итак, я получаю сообщение об ошибке: 'конфликт типов параметров' ...

функция "FC_RJS_INCLUIR_RELACAO_PRODCAT" это тоже хранимая процедура Java, она уже экспортирована в Oracle, ивозвращает переменную int, и мне нужно прочитать это, чтобы решить, какой веб-сервис я буду вызывать из этого JavaSP.

Я уже пробовал OracleTyep.NUMBER в registerOutParameter.

Кто-нибудь знает, что яя делаю неправильно?

1 Ответ

1 голос
/ 07 апреля 2010

Похоже, вам не хватает параметра в вашем вызове. Вы регистрируете выходной параметр Integer, а затем устанавливаете 2 строковых параметра. Я предполагаю, что ваша процедура FC_RJS_INCLUIR_RELACAO_PRODCAT возвращает целочисленное значение. Если это так, ваш код должен выглядеть примерно так:

CallableStatement clstAddRel = conn.prepareCall(" { ? = call FC_RJS_INCLUIR_RELACAO_PRODCAT(?,?)} ");
clstAddRel.registerOutParameter(1, Types.INTEGER);
clstAddRel.setString(2, Integer.toString(id_produto_interno));
clstAddRel.setString(3, ac[i].toString());
clstAddRel.execute();
...