2013-12-18 129 views
1

我正在研究将每个表暴露在视图中的Oracle数据库。出于清晰的原因,我已经使视图名称包含它正在展示的表的名称。现在我想知道是否有任何视图中不包含名称的表,这意味着我忘了暴露他们的视图。Oracle - 搜索另一个表中包含的一个表中的字符串

如果我查询ALL_TABLES和ALL_VIEWS,让我们假设我得到以下结果:

SELECT table_name FROM all_tables: 

TABLE1 
TABLE2 
TABLE3 


SELECT view_name FROM all_tables: 

TABLE1_VIEW 
TABLE2_VIEW 

我现在想查询两个结果,并获得中包含的任何视图名称中的所有表名和那些不是。在我的例子中,包含TABLE1和TABLE2,但TABLE3不包含。

我试着循环所有的表名,并在视图名称结果集上查找它们中的每一个。我想知道是否有更直接的方法。

+0

我不会依赖视图的名称,除非你有绝对的把握,所有的视图名称甲肝e预定义的形式,例如'TABLE1_VIEW'。而是检查“ALL_VIEWS.TEXT”列是否包含某个表名。 –

+0

你说得对,我根本不是一个可靠的方法。我主要把这视为一个挑战,因为我是Oracle的新手,而且我不会自动执行任何操作。 – ederbf

回答

1

好吧,我不确定这个解决方案将会如何清洁,但它至少是一个快速修复的肮脏方法。

假设是,你已经通过附加的表名结束的字符串(这是不变的)

创建的视图这会给你所有的表,在此基础上的一种看法目前

SELECT table_name 
FROM user_tables a 
WHERE EXISTS (SELECT 1 
       FROM user_views b 
       WHERE REGEXP_LIKE(b.view_name, a.table_name)); 

要获得的表内,如果没有意见都存在,只是用MINUS

SELECT table_name 
FROM user_tables 
MINUS 
SELECT table_name 
FROM user_tables a 
WHERE EXISTS (SELECT 1 
       FROM user_views b 
       WHERE REGEXP_LIKE(b.view_name, a.table_name)); 
+0

这就是我一直在寻找的东西。我能够通过最少的修改来使用您的代码。 – ederbf

2

现在我想找出是否有表,其名称中不包含任何视图

要通过查询[dba|all|user]_tables数据字典找到这样的表,我们可以得到我们感兴趣所有的表名中视图和minus通过查询[dba | all | user ]_dependencies数据字典视图那些已经视图的部分的那些表名:

/* A couple of test tables */ 
SQL> create table t1(
    2 col number 
    3 ) 
    4 ; 
Table created 

SQL> create table t2(
    2 col number 
    3 ) 
    4 ; 
Table created 

/* a view */ 

SQL> create or replace view v_1 as 
    2  select * 
    3  from t1; 

以下是当前模式中未包含在任何视图中的表格。 在本例中已经使用了user_ *数据字典视图,但是您可以免费使用 来使用dba_*all_*user_*数据字典视图。

SQL> column table_name format a10 

SQL> select q.table_name 
    2 from user_tables q 
    3 minus 
    4 select t.referenced_name 
    5 from user_dependencies t 
    6 where type = 'VIEW' 
    7  and t.referenced_type = 'TABLE' 
    8 ; 

结果:

TABLE_NAME 
---------- 
T2 
+0

此方法不会返回系统中可能存在的其他视图引用的表。但在类似的情况下,使用user_dependencies表可能会很有用。 Upvote为此。 – ederbf

0

如果我猜中了:包含在意见

表:

SELECT table_name FROM user_tables T 
LEFT JOIN USER_VIEWS V 
    ON T.table_name||'_VIEW'=V.view_name 
WHERE V.View_name IS NULL 

和表格不包括在访问量:

SELECT table_name FROM user_tables as T 
JOIN USER_VIEWS as V 
    ON T.table_name||'_VIEW'=V.view_name 
相关问题