2014-02-15 2 views
0

У меня есть несколько строк SQL с параметрами из лог-файла, такие какЗаменить шаблон в строке в виде списка значений (SQL)

select a,b,c from db_table where d=? and e=? 
-> params: [10,20] 

Я не могу изменить формат журнала, так что вопросительные знаки заменяются соответствующие параметры (по крайней мере, насколько я знаю, я использую Toplink в качестве сопоставления OR). Поэтому я хотел бы иметь небольшую полезность, которую я могу дать запросу, шаблону и параметрам, и он дает мне результат (GUI или нет, не имеет значения). Что-то вроде этого:

> insertUtil 'select a,b,c from db_table where d=? and e=?' '?' '10,20' 
select a,b,c from db_table where d='10' and e='20' 

Это не должно быть идеальным (например, преобразование даты и т. Д.), Оно должно просто вставлять строки. Не нужно предотвращать SQL-инъекцию, это всего лишь инструмент для отладки потенциально длинных запросов.

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

Чтобы понять это, я не ищу способ сделать подготовленные заявления с JDBC, я пытаюсь получить этот полный запрос, включая параметры, чтобы я мог выполнить его в другой программе, например, для создания запроса план для этого.

ответ

0

Short Баш скрипт (не закреплять (смотри ниже))

#!/bin/bash 

ORIG_STR="$1" 
PATTERN="$2" 
ARGS="$3" 

paste -d '' <(echo "$ORIG_STR" | sed "s/[$PATTERN]/'\n'/g") <(echo "$ARGS" | sed "s/,/\n/g") | tr -d '\n' ;echo 

Он использует замену команды.Есть более красивые вещи на земле, и это не безопасно с запросами, которым вы не доверяете (SQL-инъекция, странные паттерны вроде ']').

1

Я знаю, что это тривиально запрограммировать такую ​​вещь

«Trivial» является занижение здесь: нет ничего программировать здесь вообще, потому что все было запрограммировано для вас конструкторами JDBC ,

Вопросительный знак является маркером для параметров SQL в JDBC, поэтому все, что вам нужно сделать, это готовит заявление со строкой SQL, и настройки параметров в том порядке, что они получают:

String sqlString = "select a,b,c from db_table where d=? and e=?"; 
String[] parameters = new String[] {"10", "20"}; 
PreparedStatement ps = comn.prepareStatement(sqlString); 
for (int i = 0 ; i != parameters.length ; i++) { 
    ps.setString(i+1, parameters[i]); 
} 
ResultSet rs = ps.executeQuery(); 
while (rs.next()) { 
    ... // Get back your a, b, and c here 
} 

драйвер JDBC позаботится об остальном: он найдет маркеры параметров ? и заменит их на значения, которые вы предоставите, перед передачей запроса в РСУБД для выполнения.

EDIT: (в ответ на редактирование вопроса)

Я не искал способ, чтобы сделать подготовленные заявления с JDBC, я пытаюсь получить, что полный запрос, включая параметры поэтому я могу выполнить его в другой программе, например, для создания плана запроса для него.

Это может показаться тривиальным, но это не так: несмотря на то, кажется, что вы могли бы добиться этого с помощью простой текстовой подстановки, которые могут не работать, если вы не платите много внимания к контексту вокруг ваших знаков вопроса. Например, вам нужно пропустить замены вопросительных знаков, окруженных кавычками, или вопросительные знаки, которые закомментированы. Вы можете получить «почти хорошую» утилиту, закодированную быстро, но покрытие всех угловых случаев на удивление сложно. Если вы хотите сделать это правильно, подумайте об использовании SQL Parser utility.

+0

Извините, я обновил свой вопрос, чтобы уточнить, что я не ищу способ создания подготовленных инструкций с помощью JDBC. – Shirky

+0

Спасибо за ваше редактирование! Я знаю, что это сложно сделать правильно, но поэтому я не хочу делать это сам. У меня как-то создалось впечатление, что кто-то более умный, чем я, создал бы программу, которая может это сделать. Мне кажется, что должно быть много людей, которые хотели бы выполнить запрос из файла журнала сопоставления OR с помощью внешнего инструмента БД, например. чтобы увидеть его план запроса. – Shirky

+0

@Shirky Хорошие шансы на то, что многие люди хотели это сделать, но не обнаружили, что стоит потратить время на создание утилиты для ее автоматизации. Глядя на план запроса, как правило, это дело «один раз», а не текущее упражнение, поэтому, скорее всего, быстрее заменить параметры вручную, чем написать утилиту для ее автоматического выполнения. – dasblinkenlight

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