Java - как пакетировать вставки и обновления базы данных

Я хочу объединить несколько типов вызовов базы данных в один PreparedStatement. Это возможно?

Есть ли способ сделать что-то вроде

PreparedStatement pstmt = connection.prepareStatement("?");

где ? может быть INSERT INTO MY_TABLE VALUES(1,2,3,4) или UPDATE MY_TABLE, SET MY_VAL='1' WHERE MY_VAL IS NULL

Или мне всегда нужно указывать таблицу и действие для подготовленного оператора?


person sally    schedule 12.12.2012    source источник
comment
Нет, Java этого не допускает   -  person Parth Soni    schedule 12.12.2012
comment
Как насчет написания хранимых процедур?   -  person Pradeep Simha    schedule 12.12.2012
comment
Это не заранее подготовленное заявление. Это просто заявление.   -  person Boann    schedule 12.12.2012


Ответы (3)


Ява только добавить не позволит? в строковом параметре подготовленного оператора, поскольку он ожидает? для заполнителя только для параметров для предоставления SQL.

В вашем случае вам может потребоваться 2 подготовленных объекта операторов, и в цикле вы можете принять решение, какой из них вызвать. Это будет примерно так:

PreparedStatement insertPstmt = connection.prepareStatement("INSERT INTO MY_TABLE VALUES(?,?,?,?)");
PreparedStatement updatePstmt = connection.prepareStatement("UPDATE MY_TABLE, SET MY_VAL=? WHERE MY_VAL IS NULL");

While (<condition>) {
  If (<insert condition>) {
    // use insert pstmt and add batch
  } else {
    // use update pstmt and add batch
  }
}

insertPstmt.executeBatch(); 
updatePstmt.executeBatch();

если у вас есть какая-либо вставка, зависящая от обновления, вы можете выполнить пакеты соответствующим образом. Это обеспечит правильную работу обновления. Я бы сначала подумал о выполнении вставки, поскольку они могут не зависеть от обновления.

person Yogesh A Sakurikar    schedule 12.12.2012

В PreparedStatement после привязки переменных для первого выполнения вызовите

pstmt.addBatch();

затем привяжите переменные для следующего и каждый раз вызывая addBatch (). Затем, когда вы закончите добавлять партии, вы выполняете bacth, объединяя

pstmt.executeBatch();

Видеть :

http://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html#addBatch%28%29.

а также

http://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html#executeBatch%28%29.

Кстати: вставка всего состояния в переменную не сработает. Этот пакетный механизм существует для повторного использования одного и того же оператора, каждый раз привязывая разные переменные.

person bowmore    schedule 12.12.2012

Команды Insert и Update не возвращают никаких данных, которые необходимо обработать. Если вы хотите сделать то же самое, что и в ваших примерах, вы можете просто запустить невыполненную команду запроса и предоставить объединенную строку всех ваших строк sql, разделенных точкой с запятой.

"INSERT INTO MY_TABLE VALUES(1,2,3,4)" + ";"  +"UPDATE MY_TABLE, SET MY_VAL='1' WHERE MY_VAL IS NULL" + ";" +...

В этом случае вам не нужно готовить оператор, и вы не получите от этого никакого прироста производительности.

person Omnibus    schedule 12.12.2012