国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

從Oracle到Sql Server--Sql智能翻譯器

2024-08-29 13:31:45
字體:
來源:轉載
供稿:網友
中國最大的web開發資源網站及技術社區,
 對于這個問題,開始的設想比較簡單,大致過程是:把sql語句中不相同的關鍵字和函數名替換掉,如oracle中的to_date換成sqlserver的convert,就可以在sqlserver上執行了.對一些簡單的sql語句這樣確實可以,可是對復雜的應用來說,sql語句可能多層嵌套,函數也有多層嵌套,如果只是簡單的替換,代碼中必然會有無數的if else,并且出錯后的修改和調試幾乎是不可能的。

  通過對oracle和sqlserver兩種數據庫的sql語法的研究比較,認為必須采用語法分析,把sql語句解析為一棵語法樹,然后再按照語法的轉換規則把sql語句轉換到sqlserver上可執行的語句。要實現這樣的功能,需要用到的模式有:

  1. interpreter(解釋器)—類行為型模式:給定一個語言,定義它的文法的一種表示,并定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。通過實現解釋器模式,把要執行的sql語句解釋為sql的語法樹。例如一個select語句的結構如下

  從這張結構圖中可以看到,sql語句可能出現非常復雜的組合結構,如果不使用語法樹表示,很難實現不同數據庫平臺的轉換。

  2. composite(組合)—對象結構型模式:將對象組合成樹形結構以表示“部分-整體”的層次結構。c o m p o s i t e使得用戶對單個對象和組合對象的使用具有一致性。

  從上面的sql語句的語法結構可以看到一個查詢語句可能是很簡單的select * from atable,也可能在sql里面又包含其他的sql語句。按照組合優先于繼承的規則,并沒有給單獨的sql和復合的sql語句創建不同的類,而是在內部組合并遞歸引用自己的定義,對訪問語法樹的客戶代碼來說,并不需要了解所訪問的sql語句是否存在復合結構。

  3. visitor(訪問者)—對象行為型模式:表示一個作用于某對象結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。

  前面已經通過解釋器模式解析sql語法,用組合模式來存儲解析的語法樹,但是我們所需要的不僅如此。還要按照sqlserver的語法結構把語法樹上的各個節點重新組合,最終輸出sqlserver上可以執行的sql語句。例如:oracle中的一句連接查詢select a.*,b.* from a,b where a.id=b.id(+),在sqlserver中對應的語句應該是select a.*,b.* from a left join b on a.id=b.id。

  從這個簡單的例子中可以看到對于表的左連接或右連接,兩種數據庫的語法結構存在較大的差異。如果是在tsql類中寫某個方法,由這個方法遍歷語法樹上的每個節點,并按照sqlserver的語法結構組合所需要的結果,是可以達到這個目的的。可是如果需要從這棵語法樹導出其它數據庫上如sybase可執行的sql語句呢,那又要在tsql類中再增加新的遍歷算法,所有的相關代碼又要重新編譯。

  通過采用訪問者模式,把遍歷節點時組合語法樹節點的算法封裝再訪問者的方法中,如sqlserver的語法就是一個tsqlservervisitor類,語法樹遍歷每個節點時,都會調用它的visit方法,全部訪問完后即可通過getsql得到所需要的sql語句。這時如果我們需要轉換到sybase,只需要再實現一個tsybasevisitor類,并傳給語法樹,就可以得到sybase的sql語句了。

  4.有限狀態機--單詞和關鍵字的識別.在解析一句sql語句前,先要把其中的字符、數字、關鍵字和函數等語法元素識別出來。這顯然不能簡單的用字符定位等來判斷,而必須用狀態機來識別不同的規則表達式。這方面現在c#里的規則表達式就很好用了。不過經過重寫這些模式識別,也把以前學的編譯原理好好復習了一遍,對有些概念的理解更深入一些,只怪當初學的還不夠精啊。呵呵。

  國外較成熟的sql翻譯器參考:http://www.microsoft.com/downloads/thankyou.aspx?familyid=e35cee88-c919-463f-b020-81468cd231da&displaylang=en

http://www.ispirer.com/products 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 酉阳| 凤城市| 彭阳县| 大埔区| 柏乡县| 苏州市| 金塔县| 大埔县| 钟祥市| 襄樊市| 大化| 宜州市| 阿拉善左旗| 阿鲁科尔沁旗| 东光县| 建始县| 大理市| 石景山区| 吉安县| 临澧县| 邹平县| 芜湖县| 新蔡县| 横峰县| 肃宁县| 临桂县| 松阳县| 北辰区| 扶沟县| 龙胜| 宁都县| 金秀| 绩溪县| 安龙县| 陈巴尔虎旗| 包头市| 彭泽县| 固阳县| 太白县| 巴中市| 晋中市|