一、概念

如果一个对象的定义中引用了其他对象,那么此对象被称为依赖对象(dependent object),此对象所引用的对象被称为引用对象(referenced object)。为了管理方案对象(schema object)间的依赖关系,Oracle 需要记录所有的方案的状态(status):

有效的(valid)已经通过编译,可以在被引用时直接使用。

无效的(invalid)必须在使用之前进行编译。

INVALID状态对于过程,函数和包来说,这意味着对其进行编译

INVALID状态对于视图来说,这意味着此视图必须使用引用对象(referenced object)当前在数据字典中的定义信息重新进行语法分析(parse)。

状态记录是一个递归的过程。引用对象(referenced object)的状态变化不仅会导致其直接依赖对象(directly dependent object)的状态变化,同时会影响其间接依赖对象(indirectly dependent object)的状态。

当一个方案对象(schema object)在 SQL 语句中被直接引用或被此语句中的依赖对象(dependent object)所引用(间接引用)时,Oracle 均会在需要时对其状态进行检查。SQL 语句中被直接或间接引用的对象的状态决定了 Oracle 的后续操作:

1)如果 SQL 语句中所有的引用对象(referenced object)均处于有效状态,则 Oracle 无需进行其他工作就可以直接执行 SQL 语句

2) 如果 SQL 语句中存在无效的引用(referenced)视图或 PL/SQL 程序结构(过程,函数,或包),Oracle 将自动地尝试编译这些对象

引用对象修改后可能出现的情况如下:

如果引用表被修改,则依赖过程(dependent procedure)将处于无效状态

如果引用视图的基表(base table)被修改,则此视图及依赖过程都将处于无效状态。

如果引用独立过程被替换(replace),则依赖过程将处于无效状态。

如果引用包的定义(body)被替换,则依赖过程不受影响。但是当引用包的声明(specification)被替换后,依赖过程将处于无效状态。这是一种利用包来减少过程与引用对象之间依赖性的机制。

在分布式数据库系统中,函数,包,触发器等存储过程间的依赖性是通过时间戳检查(time stamp checking)或特征标识检查(signature checking)来进行管理的。

时间戳检查

在时间戳检查模式下,一个过程被编译或重编译时的时间戳(即一个过程被创建,修改或替换的时间)将被记录在数据字典中。同时还将记录此过程的版本信息,包括此过程所引用的所有远程过程的所属方案,包名称,过程名称,及时间戳。

当运行一个依赖过程时,Oracle 将对此过程编译时所记录的远程时间戳与远程引用对象当前的时间戳进行比较。根据比较结果,可能有两种情况发生:

如果时间戳比较结果一致,那么本地及远程过程均无需编译就可直接运行。

如果存在时间戳比较结果不一致的远程引用对象,那么本地过程将被置为无效状态,并向此过程的调用者发送一个错误信息。此后,Oracle 还会将所有引用了时间戳发生变化的远程过程的本地过程置为无效状态。例如,多个本地过程中都需调用一个远程过程,且此远程过程进行了重编译。当一个本地过程开始运行,并发现远程过程的时间戳有变后,所有依赖于此远程过程的本地过程都将被置为无效状态。

时间戳的比较发生在本地过程中调用远程过程的语句执行时。此时 Oracle 才会使用分布式数据库的通信链接(communications link)对两个时间戳进行比较。因此,本地过程中位于无效远程过程调用之前的语句可能全部运行正常,而之后的语句则根本不会运行。此时必须对本地过程进行重编译。

在同一个数据库内,被引用对象上进行了alter、drop等操作,该对象的依赖对象如view、function、procedure等,状态会自动标记为Invalid,再重新使用这些依赖对象时,系统会自动重新compile。

而一个数据库内的对象引用了远程数据库的对象(这里指程序对象,如procedure等),则远程数据库对象发生了变更,由于本地数据库并不知晓此种情况,本地数据库的这些对象状态仍然为valid,在调用这些对象时,Oracle会根据remote_dependencies_mode参数值,确定采用timestamp或signature进行依赖性检查。如果发现不匹配,则会直接报错返回,同时将依赖该远程对象的所有本地对象标记为invalid。

三、测试存储过程的last_ddl_time和timestamp何时发生变化

select *

from user_objects u

where u.OBJECT_TYPE='PROCEDURE'

AND U.OBJECT_NAME='PROC_JIFEN_CX'

OBJECT_NAME   SUBOBJECT_NAME    OBJECT_ID   DATA_OBJECT_ID      OBJECT_TYPE     CREATED      LAST_DDL_TIME TIMESTAMP STATUS

PROC_JIFEN_CX [NULL]   559675    [NULL]   PROCEDURE       2010-5-5 17:47:58.000  2010-9-16 22:19:31.000       2010-09-16:22:19:31     VALID

/

select *

from user_objects u

where u.OBJECT_TYPE='PROCEDURE'

AND U.OBJECT_NAME='PROC_JIFEN_CX'

/

OBJECT_NAME   SUBOBJECT_NAME    OBJECT_ID   DATA_OBJECT_ID      OBJECT_TYPE     CREATED      LAST_DDL_TIME TIMESTAMP STATUS

PROC_JIFEN_CX [NULL]   559675    [NULL]   PROCEDURE       2010-5-5 17:47:58.000  2010-11-5 11:38:09.000       2010-09-16:22:19:31     VALID

/

--存储过程状态为valid,编译存储过程,不改变内容,last_ddl_time改变,timestamp不变;

alter table JIFEN_CX_LOG add nyytest number(2)

/

select *

from user_objects u

where u.OBJECT_TYPE='PROCEDURE'

AND U.OBJECT_NAME='PROC_JIFEN_CX'

/

OBJECT_NAME   SUBOBJECT_NAME    OBJECT_ID   DATA_OBJECT_ID      OBJECT_TYPE     CREATED      LAST_DDL_TIME TIMESTAMP STATUS

PROC_JIFEN_CX [NULL]   559675    [NULL]   PROCEDURE       2010-5-5 17:47:58.000  2010-11-5 11:38:09.000       2010-09-16:22:19:31     INVALID

--对存储过程依赖的表进行修改,过程状态变为invalid

select *

from user_objects u

where u.OBJECT_TYPE='PROCEDURE'

AND U.OBJECT_NAME='PROC_JIFEN_CX'

/

--存储过程状态为invalid,编译存储过程,状态变为valid,last_ddl_time和timestamp都改为最新的

---远程数据库调用执行报错ORA-04062: timestamp of procedure "EDU.PROC_JIFEN_CX" has been changed; 过程状态已为valid,再次执行成功,last_ddl_time和timestamp都改为最新的

OBJECT_NAME   SUBOBJECT_NAME    OBJECT_ID   DATA_OBJECT_ID      OBJECT_TYPE     CREATED      LAST_DDL_TIME TIMESTAMP STATUS

PROC_JIFEN_CX [NULL]   559675    [NULL]   PROCEDURE       2010-5-5 17:47:58.000  2010-11-5 11:42:40.000       2010-11-05:11:42:40      VALID

三、测试package body的last_ddl_time和timestamp何时发生变化

select *

from user_objects u

where  U.OBJECT_NAME='PKG_JIFEN_CX_SET'

AND OBJECT_TYPE='PACKAGE BODY'

OBJECT_NAME   SUBOBJECT_NAME    OBJECT_ID   DATA_OBJECT_ID      OBJECT_TYPE     CREATED      LAST_DDL_TIME TIMESTAMP

PKG_JIFEN_CX_SET  [NULL]   192968    [NULL]   PACKAGE BODY 2010-11-5 11:48:45.000 2010-11-5 11:48:45.000       2010-11-05:11:48:45

---编译之前状态为valid,编译之后,last_ddl_time变化,timestamp不变

select *

from user_objects u

where  U.OBJECT_NAME='PKG_JIFEN_CX_SET'

AND OBJECT_TYPE='PACKAGE BODY'

/

select *

from user_objects u

where  U.OBJECT_NAME='PKG_JIFEN_CX_SET'

AND OBJECT_TYPE='PACKAGE'

/

OBJECT_NAME   SUBOBJECT_NAME    OBJECT_ID   DATA_OBJECT_ID      OBJECT_TYPE     CREATED      LAST_DDL_TIME TIMESTAMP STATUS

PKG_JIFEN_CX_SET  [NULL]   192968    [NULL]   PACKAGE BODY 2010-11-5 11:48:45.000 2010-11-5 11:51:23.000       2010-11-05:11:48:45      VALID

/

alter table JIFEN_CX_LOG add nyytest number(2)

--修改依赖表的表结构,package body状态为invalid,package状态为valid,远程数据库调用包执行正常,且执行过后package body已编译通过状态为valid,last_ddl_time和timestamp都已修改为当前时间

OBJECT_NAME   SUBOBJECT_NAME    OBJECT_ID   DATA_OBJECT_ID      OBJECT_TYPE     CREATED      LAST_DDL_TIME TIMESTAMP STATUS

PKG_JIFEN_CX_SET  [NULL]   192968    [NULL]   PACKAGE BODY 2010-11-5 11:48:45.000 2010-11-5 11:51:23.000       2010-11-05:11:48:45      INVALID

/

--远程数据库调用包执行正常,且执行过后package body状态为valid,last_ddl_time和timestamp都已修改为当前时间

OBJECT_NAME   SUBOBJECT_NAME    OBJECT_ID   DATA_OBJECT_ID      OBJECT_TYPE     CREATED      LAST_DDL_TIME TIMESTAMP STATUS

PKG_JIFEN_CX_SET  [NULL]   192968    [NULL]   PACKAGE BODY 2010-11-5 11:48:45.000 2010-11-5 11:54:55.000       2010-11-05:11:54:55      VALID

参考:1、ASK TOM:

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:286816015990

2、ORACLE CONCEPTS 6: Dependencies Among Schema Objects

测试环境:oracle 10.2.0.4

ORACLE包和过程依赖关系测试相关推荐

  1. oracle timestamp比较大小_ORACLE包和过程依赖关系测试

    一.概念 如果一个对象的定义中引用了其他对象,那么此对象被称为依赖对象(dependent object),此对象所引用的对象被称为引用对象(referenced object).为了管理方案对象(s ...

  2. Oracle查找包共用,oracle – 用于查找包的多级依赖关系的脚本

    对于大多数情况,您可以在user_dependencies上使用connect by. 确定依赖关系 适用于任何Oracle用户的示例,因为PUBLIC已被授予对user_dependencies的s ...

  3. Linux安装R包有什么依赖关系,linux下安装配置R环境相关依赖包

    我的系统是ubuntu12.04,安装相应的包即可. 向 /etc/apt/sources.list 中加入: deb http://archive.ubuntu.com/ubuntu precise ...

  4. oracle包函数过程,oracle 函数,包,存储过程简单实例

    /* 存储过程 参数类型: in 表示入参 out 表示出参 in out 表示既是入参又是出参 默认情况下是入参 注意: 存储过程的参数数据类型不需要指定精度 */ create or replac ...

  5. 通过IDEA查看jar包中的依赖关系

  6. 解决安装rpm包依赖关系的烦恼 - yum工具介绍及本地源配置方法

    1.背景概述 在实际生产环境下,对于在linux系统上安装rpm包,主要面临两个实际的问题 1)安装rpm包过程中,不断涌现的依赖关系问题,导致需要按照提示或者查询资料,手工安装更多的包 2)由于内外 ...

  7. linux查看服务依赖关系图,技术|教你如何在Fedora,CentOS,RHEL中检查RPM包的依赖性

    我们都知道,在基于红帽的Linux系统中,一个RPM包,需要把先将它依赖的其他包安装好才能正常的工作.对于终端用户,RPM的安装.更新.删除中存在的依赖关系已经被工具透明化了(如 yum或 DNF等) ...

  8. unity|加载AB包|有依赖关系的AB包

    进阶,异步加载AB包,请看<异步加载有依赖的AB包> 目录 为什么AB包会有依赖关系呢? 步骤 代码 为什么AB包会有依赖关系呢? 例如导入一个预制体的时候,预制体可能有图片,如果只把这个 ...

  9. structure101_使用structure101分析软件包的依赖关系

    structure101 稳定应用程序的一个关键是结构良好的代码库. 我们知道我们应该建立尽可能多的黑匣子,因为一旦完成一个黑匣子,我们就不必再考虑其内部了. 您只需要使用您或其他团队成员通过明确定义 ...

最新文章

  1. win10安装vmware tools + 无法拖拽文件解决
  2. java中jnum i .length,java数组和多维数组
  3. 写好规范 Java 代码去大厂!
  4. 【原】数据分析/数据挖掘 入门级选手建议
  5. Mac电脑隔空投递怎么添加到菜单栏?
  6. Conflux吐槽君:IOTA物联网电磁炉-让PoW的耗电没有遗憾
  7. 线性代数(9):线性正交
  8. 命令行工具解析Crash文件,dSYM文件进行符号化
  9. 正则方程手写(初步实现)
  10. Python中URL的编码和解码:quote, unquote, urlencode
  11. PG内核分析 Question and Answer
  12. 操作系统--进程调度实验报告
  13. 聊聊什么是探索式测试
  14. VASP出错 PZSTEIN parameter number 4 had an illegal value
  15. Java充电篇:Java IO常见的面试题
  16. java 显示中文_java显示中文乱码的解决方法
  17. 蓝桥杯备赛--AcWing 668. 游戏时间2
  18. Syntax error on token Invalid Regular Expression Options, no accurate corr
  19. 深入理解 Java 泛型
  20. 【翻译】Deep Anatomical Context Feature Learning for Cephalometric Landmark Detection

热门文章

  1. java 漂亮的连接曲线_猜猜 Java 为什么不支持运算符重载?
  2. 数据结构与算法:Python语言描述
  3. mybatis默认的数据源连接池(PooledDataSource和UnPooledDataSource)
  4. [Linux]F5负载均衡器
  5. django学习第77天Django框架ORM
  6. Python(七) 元组+集合+随机+string
  7. 10.14 socket 网络编程
  8. java创建配置文件_java – 如何创建紧凑的配置文件
  9. python shelve模块_python3 shelve模块的详解
  10. pycharm查看方法源码