EnterpriseDB與Oracle的相容性

2021-08-30 09:55:17 字數 3886 閱讀 1924

使用 oracle 資料庫的企業一般都會對開源資料庫感興趣,主要有以下三方面的原因:首先,通過部署開源資料庫,這些企業可以顯著降低資料庫的總擁有成本(tco),有時降幅甚至可高達90%;其次,它們通常可以從其他廠商(非oracle)處獲得更大的許可靈活性以及業務便利;最後,這些企業會發現其他一些廠商更渴望為它們提供出色的技術支援以及最佳的客戶體驗。然而,許多企業僅限於將開源資料庫用於一些簡單的應用程式(如那些支援**的應用程式),因為這些企業普遍認為開源資料庫可能不夠穩定、可靠或者可擴充套件性不夠高,因而無法滿足它們的關鍵任務應用需求;另外,企業可能還覺得更改資料庫的代價(例如,與應用程式重新編碼、人員重新培訓相關的成本)可能會超出預期的節省目標。

為了滿足這些企業的需求,enterprisedb企業版提供了最與眾不同的功能:它能夠執行針對 oracle資料庫編寫的應用程式,而無需更改應用程式**。enterprisedb 的資料庫可以與 oracle 的資料庫相容,因而使企業可以輕鬆利用對 oracle 產品的現有投資,充分享受開源資料庫帶來的巨大益處。能夠基於 enterprisedb 資料庫來執行現有 oracle 應用程式,就可以避免在通常情況下,將應用程式從 oracle 資料庫遷移到其他資料庫時所需的代價高昂、耗時且充滿風險的重新編碼工作。另外,企業的 oracle dba 和資料庫開發人員可以完全適應 enterprisedb 資料庫環境,因而無需進行代價高昂的重新培訓和重新招聘。

在位於英國牛津附近的企業效能中心(enterprise performance enter),enterprisedb 資料庫效能專家們對enterprisedb企業的效能進行了優化,使其執行速度比enterprisedb基礎版(postgresql)快50%以上。因此,能過enterprisedb我們可以獲得乙個具有高度可擴充套件性的資料庫解決方案,該解決方案極其經濟高效,令同類產品無法企及。實際上,許多客戶反映,將其現有針對 oracle 資料庫的應用程式遷移到 enterprisedb 資料庫後,應用程式效能與基於 oracle 資料庫執行的同樣的應用程式相同,甚至更快。

enterprisedb 資料庫與 oracle 資料庫能夠相互相容的基礎在於,前者能夠識別和準確執行用 oracle sql 語言表示的資料庫查詢。另外,enterprisedb 資料庫支援與 oracle 資料庫相同的資料型別、函式和變數,並可解決 oracle 資料庫與 enterprisedb 資料庫在處理字段別名、公共同義詞、序列以及 dual 表方面的不相容問題。如:

char、varchar、varchar2、number、clob、blob、date等

to_char、to_date、sysdate、dbms_***等

與oracle相同,在enterprisedb企業版中設定"字段別名"時可心省略"as"關鍵字

與oracle相同,可通過seq_name.currval 和 seq_name.nextval進行操作

enterprisedb企業版支援dual表,與oracle資料庫實現sql語句相容

等等……

enterprisedb企業版包括一種稱為 edb-spl 的過程語言,該語言與 oracle 的 pl/sql 過程語言相匹配。與 pl/sql 類似,spl 是一種高效、塊狀結構的過程程式語言,可用於編寫自定義過程、函式和觸發器。enterprisedb spl 和 oracle pl/sql 之間極大的相似性還使 enterprisedb企業版資料庫能夠支援 oracle 式的過程包、函式或變數。

與 pl/sql 一樣,spl 過程、函式和觸發器具有同樣的塊結構。乙個塊由最多三部分組成 - 乙個可選的宣告部分、乙個強制可執行程式部分以及乙個可選的異常部分。乙個塊至少必須有乙個可執行程式部分,該部分包含乙個或多個介於關鍵字 begin 和 end 之間的過程語句。

enterprisedb企業版資料庫支援 oracle 式的資料庫包。包是一種構造,用於構建可復用**和採用物件導向的設計技術。包是一組通過資料庫中通用包名稱來識別的相關資料庫物件的集合。這些資料庫物件包括過程、函式和變數。

與oracle資料庫一樣,enterprisedb企業版資料庫包有以下兩個主要部分組成:

●    包規範:這是包含公共過程、函式和變數的公共介面,這些過程、函式和變數可以在包外由其他程式和應用程式引用。

●    包體:包體包括在包規範中宣告的過程和函式的實施邏輯,以及對不能由包以外的其他程式和應用程式訪問的私有變數、過程和函式的宣告以及邏輯。

enterprisedb spl 中的過程與 oracle pl/sql 中的過程使用方式相同。過程是一些可作為單獨程式語句呼叫的程式。呼叫的時候,過程可以有選擇地以輸入引數的形式接收來自呼叫程式的值,並有選擇地以輸出引數的形式向呼叫程式返回值。通過在 enterprisedb 資料庫中輸入過程**,可將過程儲存到資料庫中。然後,可以通過其他程式呼叫該過程。

enterprisedb spl 中的函式與 oracle pl/sql 中的函式使用方式相同。函式是可作為表示式呼叫的程式。計算完成後,函式會返回乙個值,該值在該函式所嵌入的表示式中被替代。函式可以有選擇地以輸入引數的形式採用來自呼叫程式的值。除了返回值以外, 函式還可以有選擇地以輸出引數的形式向呼叫程式返回其他值。然而,在函式中使用輸出引數並非一種值得提倡的程式設計方法。函式可用於語句中任何會出現表示式的地方。

enterprisedb spl 中的觸發器與 oracle pl/sql 中的觸發器使用方式相同。觸發器是乙個**塊,該**塊具有給定的名稱,與表相關聯,被儲存在資料庫中。當發生某些針對表的事件時,**塊即被執行。當**塊被執行時,即形象地稱觸發器被"觸發"。

與 oracle 資料庫類似,enterprisedb企業版支援行級觸發器和語句級觸發器。對於受觸發事件影響的每一行,行級觸發器將被"觸發"一次。與此相對應,對於每條觸發語句,語句級觸發器將觸發一次,而無需考慮受觸發事件影響的行的數量。

和 oracle 資料庫一樣,對於語句級觸發器,可以在觸發語句之前或之後由 enterprisedb企業版執行觸發器**塊,對於行級觸發器,可以在受觸發事件影響之前或之後由 enterprisedb企業版執行觸發器**塊。

在 enterprisedb企業版資料庫中,過程**塊可以像在 oracle 資料庫中一樣,被方便地執行。這類**塊稱為匿名塊。匿名塊是未命名的,並且未被儲存在資料庫中。可以從應用程式緩衝區執行和刪除匿名塊,除非重新在應用程式中輸入塊**,否則匿名塊不可被再次執行。對於快速、一次性程式(如測試程式),匿名塊非常有用。

enterprisedb企業版提供了針對其資料詞典的檢視,這些檢視與通常使用的 oracle 資料詞典檢視非常像。這些檢視使熟悉 oracle 資料庫的資料庫管理員和開發人員能夠快速查詢詞典資訊,而無需了解新的資料詞典格式。

edb*plus是乙個工具程式,它提供乙個命令列方式的使用者介面,用於訪問enterprisedb企業版。在edb*plus中,可以使用標準sql命令,spl匿名**塊,和edb*plus命令。edb*plus 命令與oracle 的sql*plus命令相容,並且提供各種功能,包括:

●    查詢某些資料庫物件

●    執行儲存過程

●    對sql命令的輸出結果進行格式化

●    執行批量處理指令碼

●    記錄輸出

乙個資料庫鏈結(database link)定義了從乙個資料庫伺服器到另乙個資料庫伺服器的通訊通道。使用資料庫鏈結的好處是:它允許使用者能夠訪問乙個遠端資料庫的物件,這樣,該使用者便被繫結到遠端物件的使用者許可權集中。

資料庫鏈結同時也是分布式資料庫的基礎,應用程式可以同時訪問分布式環境中的多個資料庫。例如,乙個客戶端可以從本地庫中發起乙個簡單的查詢,而連線遠端資料庫的表。資料庫的位置和使用的平台對於客戶端應用程式來說是透明的。

資料庫鏈結

enterprisedb企業版支援所有用於開發oracle資料庫應用程式的最常用的程式語言。

程式語言    支援的驅動程式

c    √

c++    √

jdbc    √

odbc    √

perl    √

php    √

ruby    √

.net    √

開源資料庫EnterpriseDB進入中國

提到開源資料庫,人們首先想到的是mysql,由於效能高 成本低 可靠性好,已經成為目前流行的開源資料庫 但mysql在企業級資料服務,特別是儲存 引擎和技術支援方面一直被dba們詬病 即使被sun收購後也未見在企業級應用方面有太大改觀。是否會有一款適合企業級的開源資料庫產品?答案應該是肯定的。隨著開...

SQL與NoSQL MySQL與NoSQL的融合

寫這一篇內容的原因是mysql5.6.2突然推出了memcached的功能。nosql to innodb with memcached的出現,可以看出nosql對關聯式資料庫的確產生了巨大的影響,個人覺得這是乙個非常大的進步,可以讓開發人員更加方便的使用nosql和關聯式資料庫。nosql一般被認...

指標與陣列 a與 a區別

假設宣告了乙個陣列a,則 a表示陣列a的首位址,a與 a 0 表示陣列a首元素的首位址,那麼 a 1與a 1有哪些區別呢?通過下面的實驗來說明。int i 0 int a 5 int p int a 1 for i 0 i 5 i printf a 0x p,a 0x p,a 1 0x p n a,...