2012-10-24 28 views
0

我有一個龐大的代碼庫,它有很多JAVA和.sql文件。我打算從所有這些文件中提取所有SQL語句。從Java/SQL文件中提取SQL語句

這裏是我打算實現這一目標的方式 - 我打算提取

  1. 構建包含像SELECT,INSERT模式的正則表達式文件,刪除,更新等。
  2. 在代碼庫中逐行解析文件,並與Regex進行匹配。如果找到匹配項,請註冊代碼行,文件名,圖案等。

問題出現在SQL查詢分成多行時。

我使用java.util.regex.Matcher和java.util.regex.Pattern方法在使用緩衝讀取器讀取行時構建/匹配正則表達式模式。

pattern = Pattern.compile(regexString,Pattern.CASE_INSENSITIVE); 
    . 
    . 
    matcher = pattern.matcher(lineBuffer.readline().trim()); 
    if(matcher.find()){ 
    //Do something 
    } 

多行語句, 我應該尋找行結束「;」 - 如果找不到,我可以讀取下一行,並將輸出追加到匹配的字符串中,以便將其理解爲單個查詢。

while(!lineString.endsWith(";")) { 
    lineString = lineString + lineBfr.readLine().trim(); 
} 

有沒有更好的方式來實現的解決方案的需求在這裏使用Pattern.MULTILINE或使用StreamBuffers在那裏我將整個文件讀入一個緩衝區和工藝進一步?

回答

1

除非您的文件只包含一致的可預測格式的SQL語句,否則我認爲使用正則表達式解析SQL語句將變得非常複雜。

它看起來相當簡單,但有很多特殊情況需要處理。

  • 如何正確處理評論?
  • 單詞SELECT或包含在字符串中的分號怎麼樣?
  • 字符串轉義字符呢?

依此類推。如果你不處理所有這些,你甚至無法做到像獲得所有陳述那樣簡單的事情。

更好的方法是使用現有的庫爲您解析SQL。在這個問題中,Java似乎有幾個很好的選擇:SQL parser library for Java