2016-04-26 433 views
-1

我繼承了大型數據庫,似乎沒有人知道特定數據集來自哪個表/列。我已經花了很多時間在Oracle的SQL Developer中逐一瀏覽,但是我找不到它。 SQLDeveloper中有沒有一種方法可以在整個表中搜索單個值。例如:使用SQL Developer查找表中的值

select table_name from all_tab_columns where column_value='desired value'; 

db有大約1K +的表格,每個表格都有很多列,所以手動梳理這個不起作用。

+0

您不可能同時使用MySQL,SQL Server和Oracle。請做**不**只是隨機添加標籤,聽起來很熟悉你的問題。只添加**實際相關的標籤**。如果您不確定,請閱讀標籤說明。如果之後不確定,請不要添加標籤;如果需要的話,這裏有人會添加它。標籤具有特定的含義。 –

+0

這些是SO建議的標籤。現在刪除。 – whyeliah

+0

人們不斷建議對我的代碼進行修改。我只是在他們進來時才批准他們。我正在使用Oracle的桌面軟件SQLDeveloper。標記帖子,但是,你看到適合。 – whyeliah

回答

0

您可以使用以下腳本在模式的所有列中搜索值。腳本的執行時間取決於模式中表的數量以及每個表中的行數。

用您打算搜索的值替換'abc'。此外,腳本現在將搜索所有VARCHAR2列。您還可以將表名和計數插入到表中,而不是執行DBMS_OUTPUT.PUT_LINE。

DECLARE 

    CURSOR cur_tables 
    IS 
    SELECT table_name, 
      column_name 
    FROM user_tab_columns 
    WHERE data_type = 'VARCHAR2'; 

    v_sql   VARCHAR2(4000); 

    v_value  VARCHAR2(50); 
    v_count  NUMBER; 

BEGIN 

    v_value := 'abc'; 

    FOR c_tables IN cur_tables LOOP 
     v_sql := 'SELECT count(1) FROM ' || c_tables.table_name || ' WHERE ' || c_tables.column_name || ' = :val' ; 
     EXECUTE IMMEDIATE v_sql INTO v_count USING v_value; 
     IF v_count > 0 THEN 
      DBMS_OUTPUT.PUT_LINE('Table Name ' || c_tables.table_name || ' Column Name ' || c_tables.column_name || ' Row Count ' || v_count); 
     END IF; 
    END LOOP; 
END; 
相關問題