#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'
.