借用小小的一個問題-談談Oracle理論基礎學習的重要
2024-08-29 13:53:37
供稿:網(wǎng)友
Oracle的學習可不是一件容易事,特別是理論的知識,不僅枯燥,而且很多抽象的問題經(jīng)常讓我們的Oracle學習者感到各種各樣的困惑,從而讓我們的學習者對自己產(chǎn)生懷疑,從而放棄理論的學習,而僅僅局限在一些很膚淺的做實驗的學習中。前幾天就和一兩個朋友討論過為什么理論性的學習網(wǎng)友們不感冒,卻僅僅只是局限在做實驗的學習中。 而很多網(wǎng)友又反應做過了實驗,就只會做實驗了,而為什么做,里面每一步有什么作用卻一點都不了解。 這就是沒有好好學習理論導致的。 我讀大學是學習化學的,化學里經(jīng)常要做實驗,實驗里的每個步驟都以理論為依據(jù)的, 當時上課的時候,老師都是在實驗過程前,標注好實驗的依據(jù),實驗中的每個環(huán)節(jié)的知識點,已經(jīng)實驗最后的結(jié)論,這樣的實驗才是一個完整的實驗。 當然,沒有老師的這些基礎知識的理論,我們完全照著實驗圖解來做也可以做出來,但是這樣的實驗僅是得到最后的一個實驗產(chǎn)物,或者失敗, 除了多聞了一下實驗室里藥品的聞到,還得到了其他的什么呢?
下面我通過一個小小的問題做實例,談談Oracle理論學習的重要性。
有一個網(wǎng)友在論壇里提出了這樣一個問題
原問題見“ Oracle中可不可以用一個Select語句,查出Oracle自帶的所有函數(shù)名稱 ”
想通過select語句找到所有內(nèi)嵌的函數(shù),其實就是查詢Oracle的數(shù)據(jù)字典表了。這個問題我還是第一次遇到過,雖然對這個問題還沒有確定的答案,但是,但是作為管理平時對Oracle的數(shù)據(jù)字典的理論指導我一步一步找到答案。
在Oracle數(shù)據(jù)庫里,對PLSQL的段,function,PRocedure,package里的function和procedure,沒有分開進行管理,都是通過procedure系列的數(shù)據(jù)字典表進行管理的。所以這里的答案應該就在這里找,繼續(xù)深入,在Oracle里內(nèi)嵌的對象都是在一個名為STANDARD的package進行定義的,我們來看看dba_procedure的表的結(jié)構(gòu)
SQL> desc dba_procedures
Name Type Nullable Default Comments
-------------- ------------ -------- ------- --------------------------------------------------------------
OWNER VARCHAR2(30)
OBJECT_NAME VARCHAR2(30) Name of the object : top level function/procedure/package name
PROCEDURE_NAME VARCHAR2(30) Y Name of the procedure
AGGREGATE VARCHAR2(3) Y Is it an aggregate function ?
PipELINED VARCHAR2(3) Y Is it a pipelined table function ?
IMPLTYPEOWNER VARCHAR2(30) Y Name of the owner of the implementation type (if any)
IMPLTYPENAME VARCHAR2(30) Y Name of the implementation type (if any)
PARALLEL VARCHAR2(3) Y Is the procedure parallel enabled ?
INTERFACE VARCHAR2(3) Y
DETERMINISTIC VARCHAR2(3) Y
AUTHID VARCHAR2(12) Y
這里可以看到Object_name這個字段的描述
Name of the object : top level function/procedure/package name 頂層的package name。
根據(jù)這里的描述 我們可以看到,如果是在STANDARD這個表里建立的話,那么我們用OBJECT_name就可以查詢到這里我們需要的結(jié)果了。
用以下的sql
select * from dba_procedures where object_name = 'STANDARD'
有很多的重復記錄,加上distinct即可
最后的sql也就是
select distinct procedure_name from dba_procedures where object_name = 'STANDARD'
就是我們的最后的答案。
這個問題并不是一個復雜的問題,但是這里我們可以看到,有時我們解決問題的時候,如果對理論基礎有比較多的了解的話,可以讓我們有一個很清晰的思考和分析的方向,而根據(jù)這個方向,我們要找到我們的答案,就方便的多了。這里的這個問題就是如此,有興趣的朋友可以在google上搜尋一下,google上是沒有答案的。
基礎理論對我們的重要性就在此, 有很多的朋友平時對基礎理論不是特別看中,相反的有很多網(wǎng)友僅僅只是通過實例操作和做實驗來進行,這個是一個不正確的認識,的確實驗和實例相對于理論學習更具體,而且對著實驗做,一步一步,描述的清楚,而且學起來又簡單,但是對于龐大的知識體系,比如說Oracle,不同的case導致不同的結(jié)果,單憑一個小小的實驗很難深入到真正的Oracle體系,你做的個這個實驗可能改變小小的一點,就會導致另外的表現(xiàn),而必須用另外的方式去解釋和解決。 如果你的知識點是以單個點為基礎的,那么可想而知,如此窄的認知,在千變?nèi)f化的組合面前就顯的太單薄叻, 我們只有通過基礎理論的加深,把我們單一的知識點匯集和深入到線,甚至面的基礎上,這樣的認知才是有力度的。才能在復雜紛亂的情況下,找到問題的本質(zhì)。Oracle學習之道就在此,理論為主,實驗為輔,有理論的實驗才是一個有意義的實驗。不要做完了實驗,是看到個成功和失敗。其他的什么都沒有印象叻。