从模式中查找列和值扫描oracle中的所有表

Posted

技术标签:

【中文标题】从模式中查找列和值扫描oracle中的所有表【英文标题】:Find a column and a value from a schema scan all the table in 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/

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

【问题讨论】:

【参考方案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' 的所有表,这是最简单的方法。

以上是关于从模式中查找列和值扫描oracle中的所有表的主要内容,如果未能解决你的问题,请参考以下文章

在从不同模式调用过程时如何在 oracle 中查找所有嵌套的依赖对象

无法使用 Spark/Scala 从 JSON 嵌套键值对创建列和值

如何根据Oracle中的值查找表名[重复]

是否可以使用模式匹配从 Oracle SQL 数据库中选择列?

如何在 Oracle SQL 中列出模式中的所有表?

根据列和值在dataGridView中查找一行