Искаженная строка SQL92 в позиции: 5. Ожидание «вызова»?

#java #oracle #jdbc

#java #Oracle #jdbc

Вопрос:

Начиная с заголовка, я получаю исключение при попытке вызвать функцию Oracle из моего кода Java. Я пробовал несколько вещей, но не сработало. На данный момент я не уверен, что делать. Любая помощь или предложения будут оценены. Заранее спасибо.

Java

 CallableStatement cstmt = p_con.prepareCall("{? = CALL FXRATE_ENTITY(?, ?, ?, ?)}");
         cstmt.registerOutParameter(1, java.sql.Types.INTEGER);

         cstmt.setString(2, "SCR");
         cstmt.setString(3,l_srccur);
         cstmt.setString(4, l_tfcurr);
         cstmt.setString(5, "B001");

         cstmt.execute();
         res = cstmt.getString(1);
  

Oracle Function

 FUNCTION FXRATE_ENTITY(CODCURRBASE IN VARCHAR, LCODCURRFROM IN VARCHAR, LCODCURRTO IN VARCHAR, LIDENTITY IN VARCHAR)
  RETURN NUMBER IS
  CODCUR_L VARCHAR2(3);
BEGIN
  IF (LCODCURRTO = '*') THEN
    RETURN NVL(FXRATE(CODCURRBASE, LCODCURRFROM, CODCURRBASE, LIDENTITY),
               0);
  ELSE
    RETURN NVL(FXRATE(CODCURRBASE, LCODCURRFROM, LCODCURRTO, LIDENTITY), 0);
  END IF;
END;
  

Ответ №1:

У вас есть несколько вариантов:

А) Вы используете синтаксис SQL92 (с фигурными скобками {}). Я думаю, что для этой опции «вызов» должен быть в нижнем регистре.

 CallableStatement cstmt = p_con.prepareCall("{? = call FXRATE_ENTITY(?, ?, ?, ?)}")
  

Б) Оператор Oracle SQL CALL может использоваться для функций, но вам нужно INTO предложение. Поскольку ваш параметр OUT теперь находится в конце, измените порядок ваших операторов параметров.

 CallableStatement cstmt = p_con.prepareCall("CALL FXRATE_ENTITY(?, ?, ?, ?) INTO ?");
cstmt.setString(1, "SCR");
cstmt.setString(2,l_srccur);
cstmt.setString(3, l_tfcurr);
cstmt.setString(4, "B001");
cstmt.registerOutParameter(5, java.sql.Types.INTEGER);
  

Б) Вместо вызова вы можете использовать анонимный блок PL / SQL, как в этом примере:

 CallableStatement cstmt = p_con.prepareCall("begin ? := FXRATE_ENTITY(?, ?, ?, ?); end;");
cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
cstmt.setString(2, "SCR");
cstmt.setString(3,l_srccur);
cstmt.setString(4, l_tfcurr);
cstmt.setString(5, "B001");
  

Комментарии:

1. Ни то, ни другое не объясняет ошибку. Знаете ли вы , почему возникает ошибка ?

2. Хм, вы правы, Oracle действительно поддерживает этот синтаксис вызова jdbc … попробуйте сделать «CALL» в нижнем регистре, «call». docs.oracle.com/en/database/oracle/oracle-database/20/jjdbc /…

3. Для первого я получил исключение java.sql.SQLException: ORA-06550: line 1, column 41: PLS-00103: Encountered the symbol "INTO" when expecting one of the following: := . ( % ; The symbol ":= was inserted before "INTO" to continue.

4. для второго я получил java.sql.SQLSyntaxErrorException: ORA-00900: invalid SQL statement

5. Вероятно, вы не можете задать имя переменной, чтобы поместить результат в эту переменную. Но, возможно, вы хотите аналогичную процедуру с дополнительным выходным параметром, получающим строку 'SCR' .