您想要的是询问数据字典以查找具有某些列的所有表,然后生成查询以查找这些表中的哪些具有在这些列中具有特定值的行。没有内置的 Oracle 可以执行此操作。
执行此操作的常规方法是动态 SQL。您说您没有在数据库中创建对象的权限。好吧,好吧,只需运行一个匿名块。
此代码可以在 SQL*Plus 或任何其他 IDE 中运行。只需确保您已启用 SERVEROUTPUT。
注意rownum = 1
汇编语句中的使用。如果多个记录与条件匹配,这可以防止块抛出 TOO_MANY_ROWS 异常。这是可以接受的,因为发布的问题只需要程序断言存在一行或多行。如果实际要求不同,那么显然您需要修改代码。例如,如果您需要显示匹配记录的数量,则选择count(*)
一个数字变量并相应地更改 DBMS_OUTPUT 语句。
declare
v char(1);
begin
for r in ( select table_name from all_tab_columns
where owner = 'PRODUCT_BIS'
and column_name = 'TYPECD'
intersect
select table_name from all_tab_columns
where owner = 'PRODUCT_BIS'
and column_name = 'DESCRIPTION' )
loop
begin
execute immediate
'select null from '||r.table_name
||' where typecd=''11'' and description = ''nokia'' and rownum = 1'
into v;
dbms_output.put_line ( 'those values exist in '||r.table_name);
exception
when no_data_found then
dbms_output.put_line ( 'no occurrence of those values in '||r.table_name);
end;
end loop;
end;
此解决方案使用硬编码值。我认为这是一次性要求,所以没关系。但是,如果是一个脚本,您将希望针对模式、列名和值的许多不同排列重复运行,那么您应该将其重新编写为使用替换变量的脚本。