借用小小的一个问题-谈谈Oracle理论基础学习的重要

11/3/2009来源:Oracle教程人气:2825

Oracle的学习可不是一件容易事,特别是理论的知识,不仅枯燥,而且很多抽象的问题经常让我们的Oracle学习者感到各种各样的困惑,从而让我们的学习者对自己产生怀疑,从而放弃理论的学习,而仅仅局限在一些很肤浅的做实验的学习中。前几天就和一两个朋友讨论过为什么理论性的学习网友们不感冒,却仅仅只是局限在做实验的学习中。 而很多网友又反应做过了实验,就只会做实验了,而为什么做,里面每一步有什么作用却一点都不了解。 这就是没有好好学习理论导致的。 我读大学是学习化学的,化学里经常要做实验,实验里的每个步骤都以理论为依据的, 当时上课的时候,老师都是在实验过程前,标注好实验的依据,实验中的每个环节的知识点,已经实验最后的结论,这样的实验才是一个完整的实验。 当然,没有老师的这些基础知识的理论,我们完全照着实验图解来做也可以做出来,但是这样的实验仅是得到最后的一个实验产物,或者失败, 除了多闻了一下实验室里药品的闻到,还得到了其他的什么呢?

下面我通过一个小小的问题做实例,谈谈Oracle理论学习的重要性。

有一个网友在论坛里提出了这样一个问题

原问题见“ Oracle中可不可以用一个Select语句,查出Oracle自带的所有函数名称 ”

想通过select语句找到所有内嵌的函数,其实就是查询Oracle的数据字典表了。这个问题我还是第一次遇到过,虽然对这个问题还没有确定的答案,但是,但是作为管理平时对Oracle的数据字典的理论指导我一步一步找到答案。

在Oracle数据库里,对PLSQL的段,function,PRocedure,package里的function和procedure,没有分开进行管理,都是通过procedure系列的数据字典表进行管理的。所以这里的答案应该就在这里找,继续深入,在Oracle里内嵌的对象都是在一个名为STANDARD的package进行定义的,我们来看看dba_procedure的表的结构

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。

根据这里的描述 我们可以看到,如果是在STANDARD这个表里建立的话,那么我们用OBJECT_name就可以查询到这里我们需要的结果了。

用以下的sql

select * from dba_procedures where object_name = 'STANDARD'

有很多的重复记录,加上distinct即可

最后的sql也就是

select distinct procedure_name from dba_procedures where object_name = 'STANDARD'

就是我们的最后的答案。

这个问题并不是一个复杂的问题,但是这里我们可以看到,有时我们解决问题的时候,如果对理论基础有比较多的了解的话,可以让我们有一个很清晰的思考和分析的方向,而根据这个方向,我们要找到我们的答案,就方便的多了。这里的这个问题就是如此,有兴趣的朋友可以在google上搜寻一下,google上是没有答案的。

基础理论对我们的重要性就在此, 有很多的朋友平时对基础理论不是特别看中,相反的有很多网友仅仅只是通过实例操作和做实验来进行,这个是一个不正确的认识,的确实验和实例相对于理论学习更具体,而且对着实验做,一步一步,描述的清楚,而且学起来又简单,但是对于庞大的知识体系,比如说Oracle,不同的case导致不同的结果,单凭一个小小的实验很难深入到真正的Oracle体系,你做的个这个实验可能改变小小的一点,就会导致另外的表现,而必须用另外的方式去解释和解决。 如果你的知识点是以单个点为基础的,那么可想而知,如此窄的认知,在千变万化的组合面前就显的太单薄叻, 我们只有通过基础理论的加深,把我们单一的知识点汇集和深入到线,甚至面的基础上,这样的认知才是有力度的。才能在复杂纷乱的情况下,找到问题的本质。Oracle学习之道就在此,理论为主,实验为辅,有理论的实验才是一个有意义的实验。不要做完了实验,是看到个成功和失败。其他的什么都没有印象叻。