2016-04-26 432 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; 
相关问题