2012-12-12 5 views
2

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

Есть в любом случае, чтобы сделать что-то вроде

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

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

+0

Нет, Java не разрешает это – Parth

+0

Как насчет написания Хранимые процедуры? –

+0

Это не подготовленное заявление. Это просто заявление. – Boann

ответ

3

Java не позволит вам добавлять только? в файле readystatement string, так как он ожидает? для владельца места только для параметров для 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(); 

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

0

На PreparedStatement, после связывания переменных для первого исполнения, вызовите

pstmt.addBatch(); 

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

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

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

0

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

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

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

Смежные вопросы