2011-05-16 111 views
9

我目前正在做一些oracle sql分析,並經常遇到無法正確解析各種sql分析器的有效sql語句。要麼他們解析它失敗,要麼他們的抽象語法樹被搞亂了。看來,真正能夠處理oracle sql的唯一解析器是他們自己的一個不公開的解析器,不能作爲獨立的解析器獲得。爲什麼沒有像樣的SQL解析器?

我知道,有不同的SQL語法和遵守所有的可能是不可能的。 但即使是聲稱是Oracle SQL解析器的解析器在所有情況下都不會成功。

你認爲什麼是使它很難實現特別是在一般或的Oracle SQL分析器SQL解析器的主要原因是什麼?

最佳, 請問

+0

通過「valid sql statement」,你的意思是ANSI SQL是否正確?如果是這樣,不知道爲什麼(與標準定義)任何兼容的語法將無法被解析。由於Oracle的傳統原因,Oracle特定的語法(+)仍然受支持,但新代碼應該以ansi風格編寫。在此之前,祝你好運;) – tbone 2011-05-16 12:16:35

+0

否與有效,我的意思是在一個特定的語法有效。 在我的情況下,我的Oracle SQL,我的解析器聲稱符合。 – Will 2011-05-18 15:32:47

回答

7

好的解析器很難寫。從解析器代碼的代碼生成器開始(它通常會使用一些(E)BNF類似的語法,但它有其自身的侷限性)。

解析器中的錯誤處理是它自己的研究課題。這不僅是關於檢測錯誤,而且還提供有用的信息可能是錯誤的以及如何解決它。一些解析器甚至不提供位置信息(「在線/列出現錯誤」)。

接下來,您將SQL表示爲「結構化查詢語言」,而不是「標準查詢語言」。有一個SQL標準,甚至有幾個,但是你不會找到一個實現它們的數據庫。

甲骨文勉強提供VARCHAR但你最好使用VARCHAR2。一些數據庫提供遞歸/樹狀查詢。所有這些人都使用自己的特殊語法。標準中明確定義了連接(join,left join,...)但爲什麼要使用+

最重要的是,對於每一個數據庫版本,新功能被添加到語法。

因此,儘管你可以寫一個分析器,可以讀取標準的情況下,寫,可以支持所有功能,在全世界所有主要的數據庫,幾乎是不可能的分析器。而且我甚至都沒有談到你可以在這些解析器中遇到的錯誤。

如果所有數據庫供應商都會發布語法文件,一種解決方案是。但是這些是皇冠上的珠寶(IP)。所以你應該很高興你可以使用使用而不必爲每個分析字符* CPU數量支付許可證費用。

1

他們這樣做是錯誤的? :)...這顯然可以做到,因爲數據庫引擎中的解析器可以正常工作;)...這可能是由於幾個因素造成的。該方言可能沒有很好的文檔記錄,或者最近在解析器中沒有實現方言的改變。

3

當製造商聲稱支持語言X,他的意思是「有點像X標準」,而不是標準。由於歷史原因,製造商在標準之前實施語言X作爲標準,因此他們開始犯錯;試圖讓他們的版本匹配該標準通常會打破他們龐大的用戶代碼基礎;並且他們總是希望添加他們自己的好東西來鎖定他們的用戶。

對於SQL,C,C++,這是正確的...我所知道的唯一語言是人們嘗試真的難以匹配的標準是阿達,甚至有多種方言。 (看看哪些瀏覽器接受!)。

所以你不能指望現成的通用SQL解析器來解析PLSQL。你真的必須有一個PLSQL解析器。由於文檔很差,這些很難構建,Oracle沒有理由修復它,當然也沒有動力去幫助語法構建者。

我的公司(語義設計)有一個PLSQL parser,覆蓋10g非常好(Oracle的文檔很差...我們一直在查找參考文檔的變體),並且大部分是11g。我們已經運行了數百萬行的PLSQL代碼。

1

元數據。

選擇identifier_1.identifier_2 FROM表

可能意味着identifier_1是一個模式或包,identifier_2可能是一個函數或同義詞的功能。

爲什麼一個聲明可能是正確的,但沒有關於數據庫對象的元數據就無法理解,有一系列原因。鑑於這些限制,解析可以走多遠是有限制的。

如果一個解析器可以解決80%的代碼,並且15%不能在沒有元數據的情況下解決,那麼伸縮解析器以應對缺失的「5%」時會降低迴報。

0

如果你看一看的Oracle SQL參考: http://docs.oracle.com/cd/B28359_01/server.111/b28286/toc.htm

你就會知道它是多麼的困難創建SQL解析器,完全支持所有的Oracle SQL語法,這幾乎是不可能的。

即使上面列出的文檔沒有記錄可用於創建Oracle SQL解析器的所有語法。

對於每個數據庫版本,都會不斷添加新的語法。

我認爲SQL解析器像general sql parser涵蓋了各種主要數據庫的最重要的SQL語法可能是一種選擇。

+0

這可能很難,但是Oracle肯定已經創建了一個。 – 2014-04-29 08:31:27

相關問題