2009-10-19 74 views
3

我正在爲使用Oracle的大公司開發企業軟件。主要的處理單元計劃在PL/SQL中開發。我想知道是否有像Hibernate for Java一樣的ORM,但是用於PL/SQL的ORM。我對如何使用PL/SQL和Oracle系統表製作這樣的框架有一些想法,但這很有趣 - 爲什麼以前沒有人這樣做過?你認爲在速度和內存消耗方面有什麼效果?爲什麼?ORM for Oracle pl/sql

+0

我的意思是,我可以創建一組Oracle對象(使用腳本生成的'使用創建或替換類型FOO作爲對象..'語句) ,這將緩解pl/sql軟件的進一步發展(那些基本上包含CRUD操作)。你認爲,這些物體會有效地運作嗎? – Arino 2009-10-19 12:20:19

回答

10

奧姆斯存在提供像Java和數據庫無關的語言,如Oracle數據庫管理系統之間的接口。相比之下,PL/SQL更瞭解Oracle數據庫管理系統,並且可以與之配合使用(並且比Java + ORM更有效)。所以PL/SQL和Oracle DBMS之間的ORM既是多餘的,也是無益的!

+0

我的意思是我可以創建一組Oracle對象(使用'create或replace type FOO as object ..'語句使用腳本生成),這將簡化pl/sql軟件的進一步開發(這些將基本包含CRUD操作)。你認爲,這些物體會有效地運作嗎? – Arino 2009-10-19 12:06:44

+0

我從來沒有遇到過這種情況會有所幫助,並且我相當確信性能不會像沒有使用對象的PL/SQL代碼那樣高效。您也很有可能失去執行基於集合的操作和批量插入/更新的能力。 – 2009-10-19 12:52:15

2

正如託尼指出奧姆斯真正作爲應用程序和Db背景下邊界之間的幫手。

如果您正在尋找抽象數據庫層額外的水平,你可能想看看錶封裝。這是21世紀初的一個大趨勢。如果你搜索,你會發現在這個問題上的大量白皮書。

Plsqlintgen似乎仍然是圍繞在http://sourceforge.net/projects/plsqlintgen/

+0

你認爲這種技術有效嗎? – Arino 2009-10-19 12:46:37

+0

我認爲這取決於抽象背後的原因和項目的規模。如果你有100張桌子,它很快就會成爲維修的噩夢。表現也可能是一個問題。一般來說,我試圖避免這種模式,除非它是滿足安全性(SOX,HIPPA等)問題的唯一方法。 – 2009-10-19 19:24:56

0

Oracle是一個關係數據庫,同時還也有能力作爲面向對象的數據庫工作。它通過在關係結構之上構建一個抽象層(相當自動)來實現這一點。這似乎不需要任何「工具」,因爲它已經內置了。

1

這個答案對在PL/SQL塔皮斯(表API)來進行CRUD操作包裹你的表的利弊一些相關的想法。

Understanding the differences between Table and Transaction API's

也有在過去幾年英國甲骨文用戶組就是一個很好的小組討論 - 總的結論是反對使用表API和事務API,出於同樣的原因 - 的PL /力量sql是SQL語句的過程控制,而TAPI則推動您遠離編寫基於集合的SQL操作和逐行處理。

TAPI的參數是您可能希望實施某種訪問策略的地方,但Oracle提供了許多其他方式來執行此操作(細粒度訪問控制,約束,插入/更新/等的觸發器可以是用於填充默認值並強制調用代碼傳遞有效請求)。

我肯定會建議不要在PL/SQL對象類型中封裝表。

很多pl/sql的生產力來自於這樣一個事實,即您可以根據底層數據庫結構輕鬆定義事物 - 行記錄類型可以簡單地定義爲%ROWTYPE,並且會自動受到影響表結構變化。

myRec myTable%ROWTYPE 
INSERT INTO table VALUES myRec; 

這也適用於基於對這些類型的集合,並且有可用於獲取&插入整個集合強大的批量操作。另一方面,每次你想改變對象類型時,都必須明確地影響對象類型 - 每次表的改變都需要對象類型的影響和釋放,使你的工作翻一番。

如果您正在使用繼承和類型集合(您可以'替換'一個包,但一旦被另一個類型使用後不能替換它,那麼它也可能很難發佈更改。

這不會把OO PL/SQL放在一個地方 - 它絕對可以簡化代碼(即避免代碼重複,任何地方你都可以從多態性中獲益) - 但最好理解併發揮其優勢語言和主要優勢在於語言與底層數據庫緊密耦合。這就是說,我經常發現自己創建了構建默認記錄,插入記錄等的程序 - 通常足以讓它具有編輯宏 - 但我從來沒有找到一個好的參數來自動生成此代碼所有表(創建大量未使用的代碼的好方法)