Oracle11g新特性:在线操作功能增强-Oracle对象依赖性判断增强 (转载)

来源:互联网 发布:手机金属探测器软件 编辑:程序博客网 时间:2024/04/19 18:48

在11g之前,Oracle判断依赖性只达到了对象级,也就是说存储过程访问的对象一旦发生了变化,那么Oracle就会将存储过程置为INVALID状态。 

    Oracle使用这种方法强制存储过程在下次执行之前进行重编译,避免表结构改变后,存储过程没有更新,从而得到错误的结果。 

    这种方法没有问题,但是有的时候修改往往和关联的存储过程没有关系,但是Oracle并不对这种情况进行判断,这样会造成很多不需要重新编译的存储过程也被置于INVALID状态: 

SQL> CREATE TABLE T (ID NUMBER);表已创建。SQL> CREATE OR REPLACE PROCEDURE P_TEST AS2 BEGIN3 INSERT INTO T (ID) VALUES (1);4 END;5 /过程已创建。SQL> SELECT OBJECT_NAME, OBJECT_TYPE, STATUS FROM USER_OBJECTS WHERE OBJECT_NAME = 'P_TEST';OBJECT_NAME OBJECT_TYPE STATUS------------------------------ ------------------- ------- P_TEST PROCEDURE VALIDSQL> ALTER TABLE T ADD (NAME VARCHAR2(30));表已更改。SQL> SELECT OBJECT_NAME, OBJECT_TYPE, STATUS FROM USER_OBJECTS WHERE OBJECT_NAME = 'P_TEST';OBJECT_NAME OBJECT_TYPE STATUS------------------------------ ------------------- ------- P_TEST PROCEDURE INVALIDSQL> SELECT * FROM V$VERSION;BANNER---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - ProdPL/SQL Release 10.2.0.1.0 - ProductionCORE 10.2.0.1.0 ProductionTNS for 32-bit Windows: Version 10.2.0.1.0 - ProductionNLSRTL Version 10.2.0.1.0 - Production


    上面这个简单的例子就说明了这种情况,对于存储过程P_TEST来说,只是访问了T的ID列,T表新增NAME列,并不会影响存储过程P_TEST。但是在10g及以前版本,Oracle的判断依赖性达不到字段级。 

    而从11g开始,Oracle细化了依赖性的判断,下面看看在11g中同样的例子:

SQL> CONN YANGTK/yangtk@ORA11G已连接。SQL> CREATE TABLE T (ID NUMBER);表已创建。SQL> CREATE OR REPLACE PROCEDURE P_TEST AS2 BEGIN3 INSERT INTO T (ID) VALUES (1);4 END;5 /过程已创建。SQL> SELECT OBJECT_NAME, OBJECT_TYPE, STATUS FROM USER_OBJECTS WHERE OBJECT_NAME = 'P_TEST';OBJECT_NAME OBJECT_TYPE STATUS------------------------------ ------------------- ------- P_TEST PROCEDURE VALIDSQL> ALTER TABLE T ADD (NAME VARCHAR2(30));表已更改。SQL> SELECT OBJECT_NAME, OBJECT_TYPE, STATUS FROM USER_OBJECTS WHERE OBJECT_NAME = 'P_TEST';OBJECT_NAME OBJECT_TYPE STATUS------------------------------ ------------------- ------- P_TEST PROCEDURE VALIDSQL> SELECT * FROM V$VERSION;BANNER----------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production PL/SQL Release 11.1.0.6.0 - ProductionCORE 11.1.0.6.0 ProductionTNS for Linux: Version 11.1.0.6.0 - ProductionNLSRTL Version 11.1.0.6.0 - Production