从模式中查找列和值扫描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 嵌套键值对创建列和值