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