2012-11-02 33 views
0

我試圖尋找數據庫中的每個視圖的像「%THIS%」檢查在視圖中的列的存在尋找一個值

一個特定值之前,我想出了這個PLSQL代碼

DECLARE 
    match_count INTEGER; 
BEGIN 
    FOR t IN (SELECT name FROM user_dependencies where type = 'VIEW') LOOP 

    EXECUTE IMMEDIATE 
    'SELECT COUNT(*) FROM '|| t.name || ' Where Column_Name LIKE ''%THIS%'' ' 
    INTO match_count; 

    IF match_count > 0 THEN 
     dbms_output.put_line(t.name ||' '||match_count); 
    END IF; 

    END LOOP; 
END; 

但是當我嘗試運行它,我得到一個無效的標識符錯誤在執行immeadiate查詢列名。

對我來說問題很明顯,並不是每個視圖都有Column_Name,但我無法弄清楚如何在運行查詢之前查看該列是否存在,因爲我循環遍歷所有視圖。

我還能夠使用稍微修改過的版本來遍歷所有表格,儘管它們並不都具有該列,但我沒有遇到這個問題。

編輯:我包括我可以用來遍歷表的plsql代碼。

DECLARE 
    match_count INTEGER; 
BEGIN 
    FOR t IN (SELECT table_name, column_name FROM all_tab_columns 
      where table_name LIKE 'THIS%' and data_type = 'VARCHAR2' AND column_name = 'Column_name') LOOP 

    EXECUTE IMMEDIATE 
    'SELECT COUNT(*) FROM '||t.table_name || ' Where Column_name LIKE ''%THIS%'' ' 
    INTO match_count; 

    IF match_count > 0 THEN 
     dbms_output.put_line(t.table_name ||' '||t.column_name||' '||match_count); 
    END IF; 

    END LOOP; 
END; 

回答

3

我假設這是自從您標記pl/sql以來的Oracle。您可以使用Oracle的元數據表來查看錶/視圖具有的列。具體地說是USER_TAB_COLUMNS

select count(*) 
from user_tab_columns 
where table_name = [name of view] 
and column_name = [name of column] 
+0

對不起,我應該提到,我不知道如何來查詢他們有哪些列個人的意見/表。我的問題是,我不知道如何檢查一個特定列是否存在,而循環遍歷所有列。有太多的視圖單獨執行此操作,並且據我所知,沒有if(column_name.exists){}功能。我包含了我用來在編輯中遍歷表的代碼。 – user1399217

+2

@ user1399217我無法看到問題出在哪裏。 'all_tab_columns'返回表和視圖 – climbage

0

這應該查詢每一個有一個像「%START%」一列名視圖

declare 
cursor getViews is 
select table_name, column_name from user_tab_cols where table_name in 
(select view_name from user_views) 
and column_name like '%START%'; 
myResult number; 
BEGIN 
    for i in getViews 
    LOOP 
     execute immediate 'select count(*) from '||i.table_name into myResult; 
    END LOOP; 
END; 
相關問題