2008-12-04 59 views
10

對於使用Transact-SQL或PL/SQL等語言向存儲過程實際提交某些業務邏輯所需的限制和冗餘,我越來越感到沮喪。我很樂意將一些當前數據庫轉換爲Oracle,並利用其對Java存儲過程的支持,但目前此選項不可用。存儲過程比SQL更好的語言

對於支持其他語言的存儲過程的數據庫,您會推薦哪些替代方案?

+0

@Kev請打開此問題。 – PHPst 2013-10-02 04:10:06

回答

27

在數據庫管理器中使用更聰明的查詢語言有一些架構障礙。主要的是查詢優化器。 SQL的設計約束之一是它只能使用查詢優化器可訪問的構造。這意味着該語言及其功能與查詢執行引擎和查詢計劃優化程序的功能緊密相關。

另一個主要的設計約束是數據庫系統的機械性質 - 數據庫編程幾乎是獨一無二的,因爲它有一個機械組件。查詢性能受到磁盤頭查找和旋轉延遲的機械約束(您想要到達的磁頭之前的等待時間)的限制。

這有效地排除了許多可能使SQL更強大或更易於使用的巧妙抽象。許多數據庫管理系統使用可用於腳本編寫的程序替代方案來補充SQL。但是,他們與DBMS交互 執行優化程序單獨處理的一系列SQL查詢。該附帶各種DBMS平臺這種類型的一些語言是:

  • Oracle'sPL/SQLembedded Java。 PL/SQL實際上是基於Ada的 - 根據現代標準,它相當於 '舊學校', 有一個遺留代碼庫,它必須保持向後兼容。 它不一定是 令人愉快的編程環境,但 它確實具有 的設施,如並行性和 合理靈活的類型系統。對Oracle上的Java存儲過程 的主要 批評之一是您正在爲 支付Oracle的基於容量的許可 您正在運行JVM的 的CPU。

  • SQL Server CLR Integration。 與Oracle的Java 存儲過程有點相似,這允許CLR 模塊從C#(或任何其他)編譯。net 語言)將被加載到SQL Server實例中,並以與存儲過程大致相同的方式執行。 SQL Server 也有 PostgreSQL樣式的API用於通過CLR 集成和其他 鉤子爲混合SQL/CLR代碼庫製作 自定義集合函數。

  • PostgreSQL實際上就是後端語言 整合最初 開發的 系統。系統導出native C API的設備,用於 定製集合功能,存儲 引擎,程序擴展和其他 功能。 The language interfaces 是基於這個API,其中包括: PL/pgSQL(定製的語言類似 到PL/SQL),PythonPerlTcl

    這使得它進入 主流通過Illustra,Postgres的, 然後通過 的Informix(這是隨後 買斷由IBM)買斷的 商品化版本。關鍵 功能被合併到 Informix On-Line,這是仍由IBM出售的 。這些語言

一個重要的限制是其與查詢優化器 有限的交互(儘管對PostgreSQL的C API確實有這種支持)。在查詢計劃中參與 ,因爲一等公民要求查詢優化程序可以計算出您的操作將採取的資源的合理視圖。在實踐中,這種與查詢優化器的交互主要用於實現存儲引擎。

如果功能可用(所以大多數人不會有這樣做的技巧),並且(b)可能比寫作更麻煩,但這種挖掘存儲引擎的水平是(a)有些深奧的SQL中的查詢。查詢優化器的侷限性意味着你可能永遠也不會從SQL(甚至是C#或Java)中獲得SQL的可用級別。

有效查詢的阻力最小的路徑可能是 用SQL在一種其他語言中編寫一些程序性粘連的查詢。在某些情況下,計算確實適用於程序方法。

這可能會成爲一個麻煩,並導致大量的樣板SQL代碼。唯一真正的選擇是手動編碼的SQL或代碼生成系統。代碼生成的一個簡單例子是由元數據生成SQL的框架提供的CRUD功能。在ETL工具中可以看到一個更復雜的例子,例如Oracle Warehouse BuilderWherescape Red,它們通過從模型中生成大量存儲過程代碼來工作。

正是出於這個原因,我發現自己正在建造一種或另一種類型的代碼生成系統。任何模板系統都可以做到這一點 - 我已經從CherryTemplate獲得了相當不錯的里程數,但是有很多這樣的項目。 Code Generation in Action是一本關於這個主題的相當不錯的書 - 作者使用了一個基於ruby的系統,它的名字讓我感到難以置信。

編輯:如果您查看一個程序代碼塊的「顯示估計執行計劃」,您會注意到每個語句都有其自己的查詢計劃。查詢優化算法只能在單個SQL語句上工作,因此一個過程將具有一個查詢計劃林。由於程序代碼可能具有'side-effects',因此不能使用查詢優化中使用的type of algorithms來推理代碼。這意味着查詢優化器無法全局優化程序代碼塊。它只能優化單個SQL語句。

+1

Wow for content!感謝所有的鏈接/指針。 – Learning 2008-12-04 12:11:06

4

PostgreSQL支持許多腳本語言程序。正式的Perl,Python和Tcl。作爲插件,PHP,Ruby,Java以及可能還有許多其他(僅適用於Google的pl < languagename>),它們可能或可能不會處於現在的工作狀態。

哦,還有SQL Server 2005以後版本支持CLR stored procedures,在那裏你可以使用.NET語言。

2

Oracle不支持CLR存儲過程,因此您可以使用任何.NET語言(如C#,VB.NET或IronPython)編寫存儲過程。這隻適用於數據庫服務器在Windows機器上運行的情況。當數據庫運行在Linux或Unix上時,你無法做到這一點。

1

DB2 Z/OS是我所知的支持大多數語言的數據庫。它支持COBOL,C/C++,JAVA作爲存儲過程,它當然也支持SQL過程。