2011-04-04 99 views
2

这似乎应该是一件容易的事情,但我正在努力寻找任何答案。如何将列USER_VIEWS.TEXT包含在where子句中

我希望能够在Oracle中查询USER_VIEWS表以查找使用特定表的其他视图。

喜欢的东西:

SELECT view_name, text FROM user_views WHERE text LIKE'%MY_TABLE%'

我得到的错误: ORA-00932:不一致的数据类型:预期数量有LONG

文本的数据类型是LONG和蟾蜍它显示WIDEMEMO。

我已经试过将它,to_char和连接。我试着用TEXT数据创建另一个表,并得到ORA-00997:非法使用LONG数据类型。

任何想法?

谢谢!

回答

6

技术上讲,你可以使用DBMS_METADATA包在CLOB中获取视图的DDL,然后解析查找对表的引用。但是比查看视图定义要容易得多。

Oracle在USER_DEPENDENCIES视图(或ALL_DEPENDENCIESDBA_DEPENDENCIES,具体取决于您的权限级别以及是否尝试跟踪架构间的依赖关系)中维护有关对象依赖关系的信息。你好得多使用这些观点

SQL> create table base_table (
    2 col1 number 
    3 ); 

Table created. 

SQL> create view my_view 
    2 as 
    3 select * 
    4 from base_table; 

View created. 

SQL> select name, type 
    2 from user_dependencies 
    3 where referenced_name = 'BASE_TABLE'; 

NAME       TYPE 
------------------------------ ------------------ 
MY_VIEW      VIEW 

如果您正在使用USER_DEPENDENCIES视图,你也可以做相关对象的树更复杂的东西。如果我创建第二个视图取决于第一个视图,我可以很容易地看到两个视图最终都使用基表。

SQL> create view my_view2 
    2 as 
    3 select * 
    4 from my_view; 

View created. 

SQL> ed 
Wrote file afiedt.buf 

    1 select level, name, type 
    2 from user_dependencies 
    3 start with referenced_name = 'BASE_TABLE' 
    4* connect by referenced_name = prior name 
SQL>/

    LEVEL NAME       TYPE 
---------- ------------------------------ ------------------ 
     1 MY_VIEW      VIEW 
     2 MY_VIEW2      VIEW 
+0

这东西是坏屁股!不知道我过去如何不必使用它。这工作完美。我很感激你花时间回答。我会投两个票,因为他们都工作,但是,这是最好的答案。谢谢! – northpole 2011-04-04 19:49:50

2

不能对LONG列使用LIKE。你可以写自己的自定义功能进行搜索,虽然 - 见http://www.techonthenet.com/oracle/questions/long_value.php 你也可以创建一个表和长列转换为CLOB列:

create table my_tab as 
select to_lob(text) from user_views; 

也看到http://www.dba-oracle.com/oracle_news/2005_5_9_converting_long_lob_data_types.htm

+0

+1这很好。 USER_DEPENDENCIES工作时无需额外的表格等。但是,谢谢! – northpole 2011-04-04 19:50:46

0

如果你只是想看看它在蟾蜍的数据网格,那么你可以打开预览:

查看=>蟾蜍选项=>数据网格=>数据=> [X]预览CLOB和LONG数据

我正在使用TOAD 10.5.1.3