2014-02-15 40 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

短bash腳本(並不安全(見下文)

#!/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

我知道這是微不足道的編程這樣的事情

「破」是這裏輕描淡寫:有什麼都在這裏進行編程,因爲一切都已經通過JDBC的設計師編程爲你。

問號是在JDBC SQL參數標記,因此,所有你需要做的就是準備語句的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驅動程序會照顧其餘的:它會找到參數標記?,並通過你傳遞查詢RDBMS執行之前提供的值進行替換。

編輯:(在回答這個問題的編輯)

我不是在尋找一種方法,使與JDBC準備語句,我試圖得到包括參數完整的查詢所以我可以在另一個程序中執行它,例如爲它生成一個查詢計劃。

這似乎微不足道,但它不是:雖然看上去除非你付出了很多的關注周圍的問號的背景下,你可以得到這樣一個簡單的文本替換完成後,可能無法正常工作。例如,你需要跳過用引號,或者被註釋掉問號包圍問號替代。您可以快速獲得一個「幾乎完美」的實用程序,但涵蓋所有角落的情況是非常棘手的。如果你想正確地做,請考慮使用SQL Parser utility

+0

對不起,我更新了我的問題,以澄清我不想用JDBC創建預準備語句的方法 – Shirky

+0

感謝您的編輯!我知道這很難做到,但這就是爲什麼我不想自己做。我總覺得有人比我更聰明的人會創建一個可以做到這一點的程序。在我看來,必須有許多人希望從OR映射器日誌文件中用外部DB工具執行查詢,例如,查看其查詢計劃。 – Shirky

+0

@Shirky很多人都希望這樣做,但沒有覺得值得他們花時間編寫一個實用程序來自動化它。查看一個查詢計劃通常是一次只做一次的事情,而不是一個持續的練習,因此手動替換參數的速度可能比編寫實用程序自動執行更快。 – dasblinkenlight