ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 在一个用户所有的表的所有字段中,查询包含某串字符的脚本

在一个用户所有的表的所有字段中,查询包含某串字符的脚本

原创 Linux操作系统 作者:sandish 时间:2013-07-11 16:57:09 0 删除 编辑
如果这个用户下的表比较多,表中的数据记录也比较多(但不是多的有几万条或以上),数据又很乱。我们想找某个字符串到底在什么表以及这个表的什么字段中出现过。则可以通过以下脚本实现。
 
我的应用场合是:实施完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博客 ” ,链接:http://blog.itpub.net/15962/viewspace-766068/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2007-12-31

  • 博文量
    13
  • 访问量
    156675