Анонимный блок, вызываемый через JDBC, выполняется без ошибок, но не запускается

#java #sql #oracle #jdbc

#java #sql #Oracle #jdbc

Вопрос:

Возможно, здесь отсутствует что-то тривиальное, но у меня есть функция в моем Java-приложении, работающем на Oracle 10g, которая генерирует кучу инструкций insert и delete в блоке BEGIN …; END;.

Когда я выполняю инструкцию, она выполняется без ошибок, но значения не вставляются / удаляются в базу данных. Если я скопирую SQL, который должен быть запущен, в SQL developer и выполню его, он работает так, как ожидалось.

Пример SQL…

 BEGIN
  INSERT INTO tablea_archive (col1,col2,col3)
  SELECT col1,col2,col3 FROM tablea;
  DELETE FROM tablea;
  INSERT INTO tableb_archive (col1,col2,col3)
  SELECT col1,col2,col3 FROM tableb;
  DELETE FROM tableb;
END;
  

Я пробовал запускать код с помощью операторов prepared, callabale и normal с помощью execute() и executeUpdate() и безрезультатно.

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

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

1. Возможно, отсутствует commit; . В SQL Develeoper есть функция автоматической фиксации на maybe.

2. Я запускаю фиксацию через объект connection после запуска обновления. Я также пробовал это с включением автоматической фиксации и добавлением фиксации в конце блока.

3. Неважно. Я полностью не прочитал ваш SQL, удалив свой ответ.

4. Был ли на этот вопрос дан ответ, если да, отметьте его как таковой. Спасибо.

Ответ №1:

Я бы попробовал что-то вроде

 BEGIN
  INSERT INTO tablea_archive (col1,col2,col3)
  SELECT col1,col2,col3 FROM tablea;
  RAISE_APPLICATION_ERROR(-20001,'Inserted '||sql%rowcount||' rows');
END;
  

Ваша обработка ошибок должна выдавать вам некоторую форму сообщения о том, сколько строк было вставлено при вставке. Если у вас нет журнала ошибок, посмотрите на ошибки записи в конце базы данных

Я бы заподозрил либо неправильную базу данных, либо неправильную схему.

Ответ №2:

Этот фрагмент кода работает. Может быть, это может вам помочь:

 String  plsql = "BEGIN :myresult := dbms_random.random ; END;";
OracleDriver oracledrv = new OracleDriver();
Connection   con = oracledrv.connect(connstr, new Properties());

for (int i = 0 ; i < 1000 ; i   ) {
    CallableStatement cb = con.prepareCall(plsql);
    cb.registerOutParameter("myresult", Types.INTEGER);
    cb.execute();
    System.out.println("random ->"  cb.getInt("myresult"));
    cb.close();
}
con.close();
  

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

1. cb.execute(); должно быть cb.executeQuery(); , иначе вы получите java.sql.SQLException: Incorrectly set or registered parameters.