【问题标题】:Find a column and a value from a schema scan all the table in oracle从模式中查找列和值扫描oracle中的所有表
【发布时间】:2020-05-07 16:47:03
【问题描述】:

我正在尝试从架构中找到一列 (ABC) 和它的值 1234,基本上我需要检查是否 ABC 和该列中的值 1234 存在于映射到 ABC 的任何其他表中,我尝试以最有效的方式进行搜索,但它需要很多时间并且没有检索到所需的结果

我试过了 https://lalitkumarb.wordpress.com/2015/01/06/sql-to-search-for-a-value-in-all-columns-of-all-atbles-in-an-entire-schema/

但查询根本不是结果,它正在运行...

【问题讨论】:

    标签: plsql oracle-sqldeveloper plsql-package


    【解决方案1】:

    如果您在set Serveroutput 上出现缓冲区溢出,您可以将输出写入文件,否则应该这样做。输出将包含所有具有'ABC' 列的表,并且相应的计数显示具有ABC 列值的记录计数为1234.

    SET SERVEROUTPUT ON 100000
    DECLARE 
    lv_count number(10):=0;
    l_str    varchar2 (1000);
    BEGIN 
    FOR V1 IN 
    (select distinct table_name 
     from dba_tab_columns 
     where column_name = 'ABC')
    
     LOOP
    
      BEGIN 
        lv_query := ' select count(*) from '||v1.table_name||' where ABC =1234';
        EXECUTE IMMEDIATE lv_query INTO lv_count;
        dbms_output.put_line(v1.table_name||' --> '||lv_count);
    
        EXCEPTION 
           WHEN OTHERS THEN 
             dbms_output.put_line('OTHERS EXCEPTION '||v1.table_name||' ERRCODE '||SQLERRM||' '||SUBSTR(SQLCODE,1,200));
        END; 
    
     END LOOP;
    
    END;
    

    要查找所有列名称为 ABC 的表,应该进行如下简单查询。

    select table_name 
         from dba_tab_columns 
         where column_name = UPPER('ABC');
    

    PS:元数据表(dba_Tab_columns)以大写存储column_name,以避免任何大小写问题,将大小写转换为大写。

    PL/SQL 块中的第二个查询,

     SET SERVEROUTPUT ON 100000
        DECLARE 
        lv_count number(10):=0;
        l_str    varchar2 (1000);
        lv_col_name varchar2(255) :='ABC';
    
        BEGIN 
        FOR V1 IN 
        (select distinct table_name 
         from dba_tab_columns 
         where column_name = lv_col_name)
    
         LOOP
          dbms_output.put_line(lv_col_name||' '||v1.table_name);    
         END LOOP;
    
        END;
    

    【讨论】:

    • 应该是 - all_tab_columns 我也更新了它并尝试了同样的错误
    • 这取决于您拥有什么权限,我已将 dba_tab_columns 替换为 all_Tab_columns,未声明 lv_query 变量。它运行无错误,你现在可以试试吗。
    • @rakesh - 如果这对你有用,你能投票吗?我相信应该很快。
    • @VN'Corner - 如果我只想搜索 ABC,我还有一个问题?
    • 只需删除循环中的 BEGIN..END 块并将其替换为 dbms_output.put_line(v1.table_name);这将打印列名称为 ABC 的所有表。或者从 all_tab_columns 中选择不同的表名称,其中 column_name = 'ABC' 将返回列名称为 'ABC' 的所有表,这是最简单的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 2015-08-27
    • 1970-01-01
    • 2010-12-11
    • 2011-12-30
    • 2012-01-31
    • 2015-01-28
    相关资源
    最近更新 更多