美文网首页程序园
Oracle SQL 学习笔记27 - plsql中的依赖关系

Oracle SQL 学习笔记27 - plsql中的依赖关系

作者: 赵阳_c149 | 来源:发表于2020-02-14 10:32 被阅读0次

依赖关系定义

一些对象引用另一些对象作为他们定义的一部分。例如,一个存储过程可能包含一个SELECT语句从表中选择列,这样,存储过程被称为依赖的对象,而表被称为被引用的对象。


dep_def.JPG

依赖关系的类型

plsql中的依赖关系可分为直接依赖和间接依赖:


type.JPG

又可分为本地依赖和远程依赖。

本地依赖
local.JPG

在本地依赖的情况下,对象是在相同数据库的节点上。Oracle数据库自动管理所有本地依赖。当一个引用被修改时,依赖对象就成为失效的。当一失效的对象下一次被调用时,Oracle服务器自动重新编译它。
假设一个视图的基表结构被修改,当使用DESCRIBE命令查看视图结构时,会得到一个错误信息,查看的对象的状态是无效的。


local_invalid.JPG
本地依赖举例1
local_invalid_ex1.JPG

查询USER_DEPENDENCIES

SELECT  name,  type,  referenced_name,  referenced_type
FROM  user_dependencies
WHERE  referenced_name  IN  ('EMPLOYEES',  'EMP_VW');
  • 展现直接和间接依赖关系
  1. 运行utldtree.sql
  2. 执行DEPTREE_FILL
  3. 从视图deptree/ideptree中查看依赖
EXECUTE  deptree_fill('TABLE',  'SCOTT',  'EMPLOYEES')
  • 实例
SELECT  nested_level,  type,  name
FROM  deptree
ORDER  BY  seq#;
本地依赖举例2
local_dep_ex2.JPG
  • 新建本地表导致同义词重名发生失效
    假设原来的QUERY_EMP过程引用一个名为EMPLOYEES的公共同义词,但正好又在相同scheam中创建了一个名为EMPLOYEES的新表,需要在USER_TAB_PRIVS数据字典中跟踪安全依赖。

理解远程依赖

remote_dep.JPG

远程依赖变化

remote_change.JPG

远程依赖的概念

远程依赖的模式可以设置

  1. TIMESTAMP checking:依据编译时间戳
  2. SIGNATURE checking:依据编译时间戳和签名

设置REMOTE_DEPENDENCIES_MODE

设置REMOTE_DEPENDENCIES_MODE有以下几种方式

  1. 作为 init.ora的参数
    REMOTE_DEPENDENCIES_MODE=value
  2. 在系统级别
ALTER  SYSTEM  SET
REMOTE_DEPENDENCIES_MODE=value
  1. 在会话级别
ALTER  SESSION  SET
REMOTE_DEPENDENCIES_MODE=value

远程依赖和Time Stamp模式

假设远程Procedure B在上午8点编译:


remote_B_compile.JPG

假设本地Procedure A在上午9点编译:


local_A_compile.JPG

执行A是没有问题的


A_OK.JPG

假设B在上午11点编译:


remote_B_compile2.JPG

失效后第一次执行A报错


A_error.JPG

签名模式

对过程和函数的签名包括:过程名称,参数个数类型,参数输入输出类型和函数返回类型。
远程过程签名保留于本地过程之中,当执行本地过程需要引用远程过程则先比较时间戳,不一致则进行签名比较。也就是说,即便远程重新编译,如果远程过程签名未变仍可调用。

重新编译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 之间同样有依赖关系

p2.JPG

在从一个独立过程或者函数引用一个包过程时,可以用包极大的简化依赖管理。

  • 如果包体改变而包头不变,独立过程引用的包结构保持不变

  • 如果包头改变,外部过程引用一个包体中的结构是无效的


    p1.JPG
  • 如果一个过程被包中的过程引用,过程被改变,整个包体是无效的,但包头有效。因此,建议将该过程放入包内。

参考文档:
http://www.doc88.com/p-3337992872116.html

相关文章

网友评论

    本文标题:Oracle SQL 学习笔记27 - plsql中的依赖关系

    本文链接:https://www.haomeiwen.com/subject/szkhfhtx.html