2011-04-04 97 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