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?