2012-09-14 18 views
3

爲了避免在一個類中創建SQL語句作爲字符串,我將它們作爲.sql文件放在同一個包中,並將其內容讀取到靜態構造函數中的字符串中。原因在於SQL由於SQL查詢的ERP系統而非常複雜。有沒有一種乾淨的方式來讀取嵌入式SQL資源文件?

這種方法沒有問題,但由於SQL讀取機制很簡單,只是讀取整個文件,該文件中的任何註釋可能會導致讀取失敗,如果它們在行尾,就像先讀取刪除多餘的空白並刪除新行。完整註釋行(即從--開始的行被刪除)。

我可以增強簡單的閱讀來讀取文件和刪除註釋行等,但我不知道是否有可用的東西可以讀取SQL文件並清理它。

+0

以某種方式類似:http://stackoverflow.com/questions/660609/sql-parser-library-for-java – zeller

+4

爲什麼你必須清理乾淨的東西。我發現刪除換行符會打斷你的註釋,但爲什麼不簡單地將查詢傳遞給數據庫引擎?這樣,您甚至可以在錯誤消息中獲得有意義的行號。 – MvG

+0

這是一個有效的MvG點,不過由於這些格式化的SQL語句中的一些非常大,在某些情況下超過100行,由於來自'left join'的'case'語句和嵌套'選擇'語句有很多要整理保存。我們的RDBMS(OpenEdge)也不提供錯誤的行號,實際上包含了所有的空白,沒有錯誤的新行,使得識別錯誤變得更加困難。儘管對於其他情況,您的觀點仍然有效。 –

回答

0

我已經看到這個問題通過將查詢存儲在XML中並在運行時將XML加載到自定義StoredQueriesCache對象中解決。要獲得查詢,我們將調用StoredQueriesCache對象上的方法,並傳遞查詢名稱(在XML中定義),並返回查詢。

寫這樣的東西相當簡單。 XML將如下所示:

<Query> 
    <Name>SomeUniqueQueryName</Name> 
    <SQL> 
    SELECT someColumn FROM someTable WHERE somePredicate 
    </SQL> 
</Query> 

對於每個存儲的查詢,您都有一個元素。在應用程序從文件啓動時,XML將被加載到內存中,或者根據您的需要,它可能會從文件中延遲加載。然後,包含XML的StoredQueriesCache對象將具有按名稱返回單個查詢的方法。根據我的經驗,查詢中的評論從來沒有引起過任何問題,因爲換行符是XML節點內聯網的一部分,但是如果您希望用於檢索查詢的StoredQueriesCache方法可以解析註釋。

我發現這是存儲查詢時最有組織的方式,不用將它們嵌入代碼中,也不使用存儲過程。應該誠實地有一個圖書館爲你做這件事;也許我會寫一個!

+0

不錯的想法,儘管你失去了IDE驗證SQL的能力,並且無法執行隔離測試的查詢。我目前只是在可以正常工作的項目中使用嵌入式SQL資源文件。我在加載資源文件時刪除了行註釋,但如果註釋位於行尾,則不起作用,於是我刪除換行符,因爲我們的SQL引擎(OpenEdge)在報告錯誤時播放不好線路中斷。 –

相關問題