utldtree

utldtree.sql是Oracle 提供的一个分析依赖的sql文件。

路径:%ORACLE_CLIENT%\RDBMS\ADMIN

因为没有包含在数据库标准包中,所以需要自己手动在数据库中执行utldtree下。

utldtree创建的objects:

序列:deptree_seq

1
2
> create sequence deptree_seq cache 200
>

表:deptree_temptab

1
2
3
4
5
6
7
8
> create table deptree_temptab
> (
> object_id number,
> referenced_object_id number,
> nest_level number,
> seq# number
> )
>

视图:deptree,ideptree

过程:deptree_fill

1
2
> create or replace procedure deptree_fill (type char, schema char, name char)
>

生成依赖关系步骤

生成依赖关系

1
2
3
4
5
6
7
8
-- 1.生成依赖关系
-- 说明:每一次调用会“清空”表DEPTREE_TEMPTAB
-- 参数说明:
-- type:对象类型(table,view,procedure...)
-- schema:当前用户名称
-- name:对象名称(待查询的被人依赖的对象)

CALL DEPTREE_FILL('PROCEDURE', 'EXCEL', 'CONCAT');

查询依赖关系结果1

1
2
3
4
5
-- 2. 查询依赖关系结果
-- 说明:
-- 这个视图附带嵌套层次

SELECT * FROM DEPTREE D ORDER BY D.SEQ#;

查询依赖关系结果2

1
2
3
4
5
-- 3. 查询依赖关系结果
-- 说明:
-- 步骤:3和2一样,只是展示方式不同

SELECT * FROM IDEPTREE;

动态语句中的object依赖无法分析

动态的SQL语句中的依赖关系是无法分析出来。所以建议少用动态语句。

动态语句解决方法:ASK TOM上提供了间接的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SQL> 
1 CREATE or replace PROCEDURE testproc IS
2 i PLS_INTEGER;
3 var_table varchar2(7):='TESTTAB';
-- 创建一个间接依赖,但是在过程中没有使用。
4 cursor dummy is select * from TESTTAB;
5 BEGIN
6 execute immediate 'SELECT COUNT(*) FROM '||var_table||'' INTO i;
7 dbms_output.put_line(TO_CHAR(i));
8* END testproc;
9 /

Procedure created.

Elapsed: 00:00:00.09
SQL> exec dbms_utility.get_dependency('TABLE', 'DWHADMIN','TESTTAB');

引用

how to find the dependencies of table?