如果这个用户下的表比较多,表中的数据记录也比较多(但不是多的有几万条或以上),数据又很乱。我们想找某个字符串到底在什么表以及这个表的什么字段中出现过。则可以通过以下脚本实现。
我的应用场合是:实施完A地市的应用后,要将系统复制到B地市,因此,A地址的名称要全部改成B地市。一个个找实在太麻烦。
--以下例子为在 ANYVIEW 用户的所有表的所有 VARCHAR2 字段的列中查询包含“山西晋城”的所在的表。
declare
in_date varchar2(100):='山西晋城';
in_schema varchar2(20):='ANYVIEW';
in_data_type varchar2(20):='VARCHAR2';
v_tablename varchar2(28);
v_column_name varchar2(28);
v_sql varchar2(2000):='';
v_size number(2):=0;
cursor cur_data is
select TABLE_NAME from all_tables WHERE wner=in_schema;
cursor col_data(p_table_name in varchar2) is select column_name from All_Tab_Columns where wner=in_schema and table_name=p_table_name
and data_type=in_data_type;
begin
open cur_data;
loop
fetch cur_data into v_tablename;
exit when cur_data%notfound;
begin
v_sql :='';
open col_data(v_tablename);
loop
fetch col_data into v_column_name;
exit when col_data%notfound;
begin
if (v_sql is not null) then
v_sql := v_sql||' or ';
end if;
v_sql := v_sql ||v_column_name ||' like ''%'||in_date||'%''';
end;
end loop;
close col_data;
if (v_sql is not null) then
v_sql := 'select count(*) c_size from '||in_schema||'.'||v_tablename||' where '||v_sql||'';
--dbms_output.put_line(v_sql);
end if;
if (length(v_sql)>0) then
execute immediate v_sql into v_size;
if (v_size >0) then
dbms_output.put_line('schema:'||in_schema||' table_name:'|| v_tablename);
end if;
end if;
end;
end loop;
close cur_data;
end;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/15962/viewspace-766068/
,如需转载,请注明出处,否则将追究法律责任。