1

我正在尝试从模式中查找列 ( 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 /

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

4

1 回答 1

0

如果缓冲区溢出,您可以将输出写入文件,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;

要查找所有具有 column_name 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;
于 2020-05-07T17:16:21.247 回答