Обнаружен символ \CLOSE\ после prepareCall

pl/sql-код TRIGER1

Вот мой код pl/sql, который я пытаюсь выполнить с помощью prepareCall

String sql = String.format(FunctionCalls.TRIGGER1);
CallableStatement callableStatement = null;
Integer result = null;
String err = null;
try {
    callableStatement = connection.prepareCall(sql);

    callableStatement.execute();
    result = callableStatement.getInt("RES_CODE");
    err = callableStatement.getString("RES_DESC" );

После выполнения я хочу получить два объявленных параметра, RES_CODE и RES_DESC, но вместо этого получаю эту ошибку:

java.sql.SQLException: ORA-06550: строка 2, столбец 1274:\nPLS-00103: обнаружен символ \"ЗАКРЫТЬ\" \n

Погуглив, многие думают, что проблема в курсоре, что нужно объявлять курсоры в секции объявлений и курсор процесса после BEGIN, но я делаю так, как написано. В PL/SQL Developer все работает нормально, вы можете видеть на картинке.

изображение

Возможно ли в java получить объявленный параметр после выполнения?

Можно ли выполнить код TRIGER1 pl/sql и получить два параметра RES_CODE и RES_DESC?


person Norayr Gharibyan    schedule 25.08.2018    source источник
comment
Пожалуйста, опубликуйте фактический код, который вы выполняете (минимизируйте его, чтобы уменьшить длину), вопросы не должны основываться на внешних ссылках для получения соответствующей информации.   -  person Mark Rotteveel    schedule 26.08.2018


Ответы (1)


Как сказано в javadoc CallableStatement: "Интерфейс, используемый для выполнения хранимых процедур SQL."

В javadoc даже показан синтаксис, который вы должны использовать, который начинается с фигурной скобки {.

Ваш SQL не хранимая процедура, это блок PL/SQL.
Кроме того, RES_CODE и RES_DESC не являются параметры.

То, что вы пытаетесь сделать, совершенно неправильно, и если какой-то сайт показал вам, как это сделать, пожалуйста, прекратите использовать этот сайт немедленно.

Попробуйте на самом деле создать хранимую процедуру с рассматриваемым кодом и определить фактические параметры для этой процедуры хранения.

Синтаксис для этого:

CREATE PROCEDURE xxx ( RES_CODE OUT number, RES_DESC OUT varchar2 ) AS
  variable declarations here
BEGIN
  code here
END;
/

Затем вы вызываете эту процедуру, используя:

String sql = "{call xxx(?,?)}";
try (CallableStatement stmt = conn.prepareCall(sql)) {
    stmt.registerOutParameter(1, TYPES.INTEGER);
    stmt.registerOutParameter(2, TYPES.VARCHAR);
    stmt.execute();
    result = stmt.getInt(1);
    err = stmt.getString(2);
}
person Andreas    schedule 26.08.2018
comment
Спасибо за ответ . Я не могу создать какую-либо процедуру в этой базе данных. Я могу только вызывать функции, процедуры и запускать selects. Если да, то как я могу запустить это из java? - person Norayr Gharibyan; 26.08.2018