2011-09-26 54 views
2

場景:我對軟件包一無所知,只是它們包含的函數和過程都包含在一個很好的小禮物中。所以今天我給了這個包(相當大)與「在這裏,這是壞了請修復它」的指示。我見過一個,但是...... 10g包裝究竟是什麼?

我終於清理了一切,這讓我想到了我的問題。

在包的整體視圖中,即將導出。

1)除了所有東西的集合之外,一個包是否還有其他用途?

2)要部署此軟件包,您是否需要設置部署空間以擁有該軟件包所調用的所有視圖/物化視圖/表?如果沒有,我假設該軟件包將無法執行。

3)你可以編寫程序包來跳過不能執行的函數和程序嗎?

4)將一個成功編譯成一個地方的軟件包帶到另一個地方時,我應該注意哪些其他的東西?

回答

6

1)除了一攬子服務之外,一個包還有其他用途嗎?

除此之外,它減少了在特定過程改變時重新編譯依賴於特定過程的其他過程的需要。

考慮許多其他程序調用的(普通的,不是封裝的)procedure XYZ(a in number)。如果此過程發生改變,則需要重新編譯所有其他過程,這可能會降低系統的可用性。另一方面,如果程序是在package中聲明的並且在package body中定義並且程序僅在主體中進行了更改(幾乎),則不會發生重新編譯。

2)要部署此軟件包,是否需要設置部署空間,以便已經擁有該軟件包所調用的所有視圖/物化視圖/表?如果沒有,我假設該軟件包將無法執行。

不,您可以安裝package body,而不需要依賴視圖或表格。包體的狀態將爲INVALID,並且不能使用包體的功能。

3)你可以編寫程序包來跳過不能執行的函數和程序嗎?

不確定,問題到底是什麼。如果包體的狀態爲INVALID,則不能執行代碼,因此不會發生「轟炸」

但是,如果爆炸出於合乎邏輯的原因(例如,除以零除),您總是可以使用exception when others then結構。

4)當把一個地方編譯成一個地方的軟件包帶到另一個地方時,我應該注意些什麼?

再次,不知道你在這裏的意思。你能否詳細說一下一個地方是什麼?架構?一個實例?安裝,公司....?

+0

問題4 ex。我把編譯成功的軟件包放在一起。但希望將其移動到另一個安裝上的另一個用戶模式。如果所有需要的觀點/表格等已經到位,那麼一切都應該順利進行? – sealz

4

1)你幾乎可以想到一個包類似於一個類。它是相關方法的邏輯分組。它也允許你封裝不應該被其他人使用的相關「幫手」方法。它們可以包含在軟件包中,只能通過成員方法訪問。

2)爲了成功地部署一個軟件包,是的,你必須擁有必要的表格,視圖等。如果它們不是,它不是無法執行任何程序或功能的軟件包,它將無法正確部署。它將在數據字典中顯示爲未編譯。

3)定義「炸彈出」。如果存在必要的對象來成功部署包,那麼其他一切都是運行時錯誤 - 應該編碼的東西。認爲異常處理。

4)同樣,包中引用的必要模式對象必須存在。如果他們不這樣做,程序包將不會編譯,並會在數據字典中標記。

+0

「類似於類」這正是我需要聽到的。謝謝 – sealz

3

除了上面的其他有用的答案。

1) 軟件包標頭還可以包含其範圍不僅僅是一個proc或函數的變量。

2) 如果要移動軟件包表/視圖,如果它們位於同一個數據庫中,並且新模式有權查看舊錶,則可能不必複製它們。或者是否可以將數據庫鏈接用於包含數據的數據庫。在某些數據庫版本中,可能會限制在數據庫鏈接上使用lobs。另一個模式中的表需要被引用{schema-name}。{table-name}。數據庫鏈接由{table-name} @ {database-link-name}指定。另一個模式授予權限的表將需要不通過角色明確完成 - 這就是甲骨文只是如何

3. 如果添加: 「異常時,別人再空;」 作爲第2最後一行在proc中(緊接在「結束」之前)它可能會做你以後的事情。

4) 軟件包可能需要授權/許可/角色/​​序列和可能的同義詞以及其他相關procs /函數包才能運行。實際上,原始模式中的任何對象都可能在包中被引用,並且可能需要它或者需要授予。

+0

+1個不錯的附加信息! –