JavaEE开源博客-阿Q

        ~用心做事,诚信做人!以德为本,兼顾各方!细心观察,联系推理!
        ~遵守规范->重构->可复用代码->可扩展性 *大道至简*
        ~时间是挤出来的,要成功,你就必须在最短的时间内采取最大量的行动!坚持到底,看到的就是胜利!再低下、再简单、再不愿意做的事情,你也要把它当成自己的事业做好!以马内利,阿们!

公告

我的分类(专题)

最新日志

最新评论

留言簿

搜索

登陆

友情连接

统计

2008-5-28 1:40:00
Oracle子程序

子程序

1、 存储子程序和数据字典

当使用CREATE OR REPLACE命令创建子程序时,该子程序就存储在数据字典中。除去子程序中的源文本外,该子程序是以编译后的中间代码形式存储的,这种中间代码叫做p-code

子程序的信息可以通过各种数据字典视力来访问,视力user_object包括了当前用户拥有的所有对象的信息。该信息包括了对象的创建以及最后修改的时间,对象类型(表、序列、函数等)和对象的有效性。视图user_source包括了对象的源程序代码。而视图user_error则包括了编译错误信息。

例如,查询视力user_objects获知某一子程序的状态、类型等,执行如下命令:

SELECT OBJECT_NAME, OBJECT_TYPE, STATUS
FROM user_objects
WHERE OBJECT_NAME=
'EVEN_ODD';

        -- EVEN_ODD 为存储过程或函数的名称

   

    执行下面命令,从user_source视图中获取子程序’EVEN_ODD’的源代码,

SELECT TEXT
FROM user_source
WHERE NAME=
'EVEN_ODD'

ORDER BY LINE;

 

2、 本地子程序

子程序可以在块的声明部分定义,以这种方式定义的子程序叫做本地子程序。

SET SERVEROUTPUT ON

DECLARE

    TYPE BookRecord IS RECORD (

    BOOKNO INTEGER,

    BOOKName VARCHAR2(40),

    ISBN VARCHAR2(20),

    AUTHORNAME VARCHAR2(20),

    PRESSNAME BOOKName%TYPE,

    Status CHAR(1),

    BOOKPRICE FLOAT

);

Book1 BookRecord;

   

    PROCEDURE PrintBookRecord(BookA IN BookRecord) IS

    BEGIN

        DBMS_OUTPUT.enable;

        DBMS_OUTPUT.put('序号: '||BookA.BOOKNO);

    DBMS_OUTPUT.put('书名: '||BookA.BOOKName);

    DBMS_OUTPUT.put('ISBN: '||BookA.ISBN);

    if BookA.Status = 'Y' then

       DBMS_OUTPUT.put('目前有货');

    else

       DBMS_OUTPUT.put('目前缺货');

    end if;

    DBMS_OUTPUT.put_line('');

    END PrintBookRecord;

 

    BEGIN

     Book1.BOOKNO:=102;

     Book1.BOOKName:= 'JavaEE ceo';

     Book1.ISBN:= '26';

     Book1.Status:= 'Y';

     PrintBookRecord(Book1);

    END;

/

 

    该过程只在声明的块中可见, 其作用域从声明点开始到该块结束为止。其他块不能调用该过程,因为该过程对其他块来说是不可见的。

    任何本地子程序都必须在声明部分的结尾处声明,否则将得到编译错误。

 

3、 存储子程序与本地子程序的比较

1)存储子程序以编译后生成的中间代码本地子程序被编译为该程序所在块的一部
形式p-code存储在数据库中。当调用该类子程序时不需进行编译即可运行,本地子程序被编译为该程序所在块的一部分,如果其所在块是匿名块并需要多次运行时,则该子程序就必须每次进行编译.
    2)
存储子程序可以从由用户提交的具有子程序优先级EXECUTE属性的任何块

中调用,本地子程序只能从包含子程序的块内调用.
    3)
由于存储子程序与调用块的相互隔离, 所以调用块具有代码少,易于理解的特点。除此之外,子程序和调用块还可以独立维护。本地子程序和调用块同处于一个块内,除容易引起混淆。如果修改了调用块的话,则该块调用的子程序作为所属块的一部分也要重新编译。

    4
)可以使用DBMS_SHARED_POOL.KEEP,打包过程来把编译后p-code代码存储在共享,缓冲区中*。这种方式可以改善程序性能。本地子程序自身不能存储在共享缓冲区中。
    5
)不能对独立存储子程序进行重载,但同一包内的打包子程序可以重载。同一块中的本地子程序可以重载。

 

4、 执行权限

为了能够对表进行访问,必须使用SELECTINSERTUPDATEDELETE对象的特权,语句GRANT把这些特权赋予数据库用户或角色,但对于存储子程序来说,相关的特权是EXECUTE

        如:把User1的过程MyProcedure的执行权限赋予一个数据库用户User2:

    GRANT EXECUTE ON MyProcedure TO User2;

 

 

个人博客:http://zhan.zhmy.com

posted @ 2008-5-28 1:40:00 sam 阅读全文 | 回复(0) | 引用通告 | 编辑
  • 标签:oracle 子程序 存储过程 本地 比较 
  • 发表评论:
    网志中国数据载入中...