user_DEPENDENCIES如何从程序中读取

时间:2013-10-31 15:36:51

标签: oracle

如果我运行此查询:

  

SELECT DISTINCT U.REFERENCED_NAME,U.REFERENCED_TYPE
  来自USER_DEPENDENCIES U
  其中U.name IN('P_CREATE_T')

它会给我:

  U.REFERENCED_NAME |  U.REFERENCED_TYPE
  random_name_table | table

如果我删除此表random_name_table:

  

drop table random_name_table

我运行dependecie查询它会给我这个:

        U.REFERENCED_NAME        |  U.REFERENCED_TYPE
  BIN$6WfJh8MWWGngQ3ATqMDOpQ==$0 | table

我知道结果与回收站有关,但我要问的是有一种方法可以显示表,即使它已经下垂了吗?我的意思是不应该从过程读取依赖性查询而不是从数据库中读取?如果没有,那么查询是从过程而不是从数据库中读取的?


编辑
好的,我会说清楚: 我的问题USER_DEPENDENCIES从程序或数据库中读取? 我的第二个问题是回收站总是显示出来吗?我的意思是有时候recylebin的结果消失了吗?

3 个答案:

答案 0 :(得分:1)

我不确定我是否理解这个问题。

如果要在recyclebin中找到对象的原始名称,可以

SELECT original_name
  FROM user_recyclebin
 WHERE object_name = 'BIN$6WfJh8MWWGngQ3ATqMDOpQ==$0'

这应该会给你掉落的RANDOM_TABLE_NAME

但是,我不确定这是你的问题。我不知道“从程序中读取而不是从数据库中读取”意味着什么。

答案 1 :(得分:1)

每次创建,删除或修改对象时,Oracle都会自动记录依赖项更改。此信息存储在“数据字典”视图中。您可以在此处找到更多信息:Schema Object Dependencies

那说回答你的问题,USER_DEPENDENCIES没有阅读,但每次更改程序时都会更新。删除表时,将其发送到bin,缺少依赖项(如果不重新创建表,则无法编译它)。

所以USER_DEPENDENCIES是一个视图,它从数据库中读取而不是从您的过程中读取。回收站结果将保留在那里,直到您的过程保持无效(您可以使用表重新编译,或删除它以修复它)。

答案 2 :(得分:1)

只是另一个尝试明确问题的含义:“程序”是一个代码。代码是一种描述执行算法的方法,并没有存储任何东西,而是代码和一些在执行开始时初始化的常量。
因此,您的过程代码“读取”(如果有)的任何内容都来自“数据库”(磁盘存储和缓存),而不是其他任何地方。

如果您对user_dependencies的内容有疑问,请回答“是一个观点”:

create or replace view sys.user_dependencies
(name, type, referenced_owner, referenced_name, referenced_type, referenced_link_name, schemaid, dependency_type)
as
select o.name,

-- ... skipped code ...

from 
  sys."_CURRENT_EDITION_OBJ"   o, 
  sys.disk_and_fixed_objects   po,
  sys.dependency$ d, sys.user$ pu

where 
-- ... another skipped code ...

sys._current_edition_obj是另一种观点:

create or replace view sys._current_edition_obj as
select 
  -- ... skipped ...
from obj$ o, user$ u
where 
  -- .. skipped ...

sys.obj $和sys.user $是内部Oracle表。