依赖关系定义
一些对象引用另一些对象作为他们定义的一部分。例如,一个存储过程可能包含一个SELECT语句从表中选择列,这样,存储过程被称为依赖的对象,而表被称为被引用的对象。
依赖关系的类型
plsql中的依赖关系可分为直接依赖和间接依赖:
又可分为本地依赖和远程依赖。
本地依赖
在本地依赖的情况下,对象是在相同数据库的节点上。Oracle数据库自动管理所有本地依赖。当一个引用被修改时,依赖对象就成为失效的。当一失效的对象下一次被调用时,Oracle服务器自动重新编译它。
假设一个视图的基表结构被修改,当使用DESCRIBE命令查看视图结构时,会得到一个错误信息,查看的对象的状态是无效的。
本地依赖举例1
查询USER_DEPENDENCIES
SELECT name, type, referenced_name, referenced_type
FROM user_dependencies
WHERE referenced_name IN ('EMPLOYEES', 'EMP_VW');
- 展现直接和间接依赖关系
- 运行utldtree.sql
- 执行DEPTREE_FILL
- 从视图deptree/ideptree中查看依赖
EXECUTE deptree_fill('TABLE', 'SCOTT', 'EMPLOYEES')
- 实例
SELECT nested_level, type, name
FROM deptree
ORDER BY seq#;
本地依赖举例2
- 新建本地表导致同义词重名发生失效
假设原来的QUERY_EMP过程引用一个名为EMPLOYEES的公共同义词,但正好又在相同scheam中创建了一个名为EMPLOYEES的新表,需要在USER_TAB_PRIVS数据字典中跟踪安全依赖。
理解远程依赖
远程依赖变化
远程依赖的概念
远程依赖的模式可以设置
- TIMESTAMP checking:依据编译时间戳
- SIGNATURE checking:依据编译时间戳和签名
设置REMOTE_DEPENDENCIES_MODE
设置REMOTE_DEPENDENCIES_MODE有以下几种方式
- 作为 init.ora的参数
REMOTE_DEPENDENCIES_MODE=value - 在系统级别
ALTER SYSTEM SET
REMOTE_DEPENDENCIES_MODE=value
- 在会话级别
ALTER SESSION SET
REMOTE_DEPENDENCIES_MODE=value
远程依赖和Time Stamp模式
假设远程Procedure B在上午8点编译:
假设本地Procedure A在上午9点编译:
执行A是没有问题的
假设B在上午11点编译:
失效后第一次执行A报错
签名模式
对过程和函数的签名包括:过程名称,参数个数类型,参数输入输出类型和函数返回类型。
远程过程签名保留于本地过程之中,当执行本地过程需要引用远程过程则先比较时间戳,不一致则进行签名比较。也就是说,即便远程重新编译,如果远程过程签名未变仍可调用。
重新编译PL/SQL
可以自动在调用时进行,也可以手动执行。
ALTER PROCEDURE [SCHEMA.]procedure_name COMPILE;
ALTER FUNCTION [SCHEMA.]function_name COMPILE;
ALTER PACKAGE [SCHEMA.]package_name COMPILE[PACKAGE | SPECIFICATION | BODY];
ALTER TRIGGER trigger_name [COMPILE[DEBUG]];
有利于编译的编程风格
- 用%ROWTYPE来定义记录类型
- 用%TYPE来定义变量
- 使用SELECT * 语句
- 在INSERT语句中明确插入列名
Package 之间同样有依赖关系
在从一个独立过程或者函数引用一个包过程时,可以用包极大的简化依赖管理。
-
如果包体改变而包头不变,独立过程引用的包结构保持不变
-
如果包头改变,外部过程引用一个包体中的结构是无效的
p1.JPG
-
如果一个过程被包中的过程引用,过程被改变,整个包体是无效的,但包头有效。因此,建议将该过程放入包内。
网友评论