[Oracle]根據字段值全庫搜索相關數據表和字段

    這個需求比較冷門,但對於在某些特定的狀況下,仍是會有這樣的須要的。好在Oracle實現還比較方便,用存儲過程則輕鬆實現。html

    查詢字符串:oop

create or replace procedure search_string(pString in varchar) as
  cursor all_tab_cursor is
    select a.owner, a.table_name, b.column_name
      from dba_tables a, dba_tab_columns b, dba_objects c
     where a.owner = b.owner
       and a.table_name = b.table_name
       and a.table_name = c.object_name
       --and a.owner in ('XXX') --用戶可選
       and b.data_type in ('VARCHAR2','CHAR','NCHAR','NCLOB','NVARCHAR2')
       and c.object_type = 'TABLE'
       order by a.owner,a.table_name,b.column_id;
  refAllTab all_tab_cursor%rowtype;

  --------------

  sSql   varchar(4000);
  nCount number;

begin
  DBMS_OUTPUT.Enable(4000000);

  open all_tab_cursor;
  loop
    fetch all_tab_cursor
      into refAllTab;
    exit when all_tab_cursor%notfound;
  
    sSql := 'SELECT COUNT(1) FROM ' || refAllTab.Owner || '.' ||
            refAllTab.Table_Name || ' WHERE ' || refAllTab.Column_Name ||
            ' = ''' || pString || '''';
    --DBMS_OUTPUT.PUT_LINE(sSql);
    execute immediate sSql
      into nCount;
  
    if nCount > 0 then
      DBMS_OUTPUT.PUT_LINE(refAllTab.Owner || '.' || refAllTab.Table_Name || '.' ||
                           refAllTab.Column_Name || ' = ' || nCount);
    end if;
  
  end loop;
  close all_tab_cursor;
end search_string;

    查詢包含字符串:測試

create or replace procedure search_string_like(pString in varchar) as
  cursor all_tab_cursor is
    select a.owner, a.table_name, b.column_name
      from dba_tables a, dba_tab_columns b, dba_objects c
     where a.owner = b.owner
       and a.table_name = b.table_name
       and a.table_name = c.object_name
       --and a.owner in ('XXX') --用戶可選
       and b.data_type in ('VARCHAR2','CHAR','CLOB','NCHAR','NCLOB','NVARCHAR2')
       and c.object_type = 'TABLE'
       order by a.owner,a.table_name,b.column_id;
  refAllTab all_tab_cursor%rowtype;

  --------------

  sSql   varchar(4000);
  nCount number;

begin
  DBMS_OUTPUT.Enable(4000000);

  open all_tab_cursor;
  loop
    fetch all_tab_cursor
      into refAllTab;
    exit when all_tab_cursor%notfound;
  
    sSql := 'SELECT COUNT(1) FROM ' || refAllTab.Owner || '.' ||
            refAllTab.Table_Name || ' WHERE ' || refAllTab.Column_Name ||
            ' LIKE ''%' || pString || '%''';
    --DBMS_OUTPUT.PUT_LINE(sSql);
    execute immediate sSql
      into nCount;
  
    if nCount > 0 then
      DBMS_OUTPUT.PUT_LINE(refAllTab.Owner || '.' || refAllTab.Table_Name || '.' ||
                           refAllTab.Column_Name || ' = ' || nCount);
    end if;
  
  end loop;
  close all_tab_cursor;
end search_string_like;

    查詢數字:fetch

create or replace procedure search_number(pNumber in number) as
  cursor all_tab_cursor is
    select a.owner, a.table_name, b.column_name
      from dba_tables a, dba_tab_columns b, dba_objects c
     where a.owner = b.owner
       and a.table_name = b.table_name
       and a.table_name = c.object_name
       --and a.owner in ('XXX') --用戶可選
       and b.data_type in ('FLOAT','NUMBER')
       and c.object_type = 'TABLE'
       order by a.owner,a.table_name,b.column_id;
  refAllTab all_tab_cursor%rowtype;

  --------------

  sSql   varchar(4000);
  nCount number;

begin
  DBMS_OUTPUT.Enable(4000000);

  open all_tab_cursor;
  loop
    fetch all_tab_cursor
      into refAllTab;
    exit when all_tab_cursor%notfound;

    sSql := 'SELECT COUNT(1) FROM ' || refAllTab.Owner || '.' ||
            refAllTab.Table_Name || ' WHERE ' || refAllTab.Column_Name ||
            ' = ' || pNumber;
    --DBMS_OUTPUT.PUT_LINE(sSql);
    execute immediate sSql
      into nCount;

    if nCount > 0 then
      DBMS_OUTPUT.PUT_LINE(refAllTab.Owner || '.' || refAllTab.Table_Name || '.' ||
                           refAllTab.Column_Name || ' = ' || nCount);
    end if;

  end loop;
  close all_tab_cursor;
end search_number;

    查詢範圍數字:spa

create or replace procedure search_number_between(pStartNumber in number, pEndNumber in number) as
  cursor all_tab_cursor is
    select a.owner, a.table_name, b.column_name
      from dba_tables a, dba_tab_columns b, dba_objects c
     where a.owner = b.owner
       and a.table_name = b.table_name
       and a.table_name = c.object_name
       --and a.owner in ('XXX')  --用戶可選
       and b.data_type in ('FLOAT','NUMBER')
       and c.object_type = 'TABLE'
       order by a.owner,a.table_name,b.column_id;
  refAllTab all_tab_cursor%rowtype;

  --------------

  sSql   varchar(4000);
  nCount number;

begin
  DBMS_OUTPUT.Enable(4000000);

  open all_tab_cursor;
  loop
    fetch all_tab_cursor
      into refAllTab;
    exit when all_tab_cursor%notfound;

    sSql := 'SELECT COUNT(1) FROM ' || refAllTab.Owner || '.' ||
            refAllTab.Table_Name || ' WHERE ' || refAllTab.Column_Name ||
            ' BETWEEN ' || pStartNumber || ' AND ' || pEndNumber;
    --DBMS_OUTPUT.PUT_LINE(sSql);
    execute immediate sSql
      into nCount;

    if nCount > 0 then
      DBMS_OUTPUT.PUT_LINE(refAllTab.Owner || '.' || refAllTab.Table_Name || '.' ||
                           refAllTab.Column_Name || ' = ' || nCount);
    end if;

  end loop;
  close all_tab_cursor;
end search_number_between;

    查詢日期:code

create or replace procedure search_date(pToDateString in varchar) as
  cursor all_tab_cursor is
    select a.owner, a.table_name, b.column_name
      from dba_tables a, dba_tab_columns b, dba_objects c
     where a.owner = b.owner
       and a.table_name = b.table_name
       and a.table_name = c.object_name
       --and a.owner in ('XXX')  --用戶可選
       and (b.data_type = 'DATE' or b.data_type like 'TIMESTAMP%')
       and c.object_type = 'TABLE'
     order by a.owner, a.table_name, b.column_id;
  refAllTab all_tab_cursor%rowtype;

  --------------

  sSql   varchar(4000);
  nCount number;

begin
  DBMS_OUTPUT.Enable(4000000);

  open all_tab_cursor;
  loop
    fetch all_tab_cursor
      into refAllTab;
    exit when all_tab_cursor%notfound;
  
    sSql := 'SELECT COUNT(1) FROM ' || refAllTab.Owner || '.' ||
            refAllTab.Table_Name || ' WHERE ' || refAllTab.Column_Name ||
            ' = ' || pToDateString;
    --DBMS_OUTPUT.PUT_LINE(sSql);
    execute immediate sSql
      into nCount;
  
    if nCount > 0 then
      DBMS_OUTPUT.PUT_LINE(refAllTab.Owner || '.' || refAllTab.Table_Name || '.' ||
                           refAllTab.Column_Name || ' = ' || nCount);
    end if;
  
  end loop;
  close all_tab_cursor;
end search_date;

    查詢範圍日期:htm

create or replace procedure search_date_between(pStartToDateString in varchar, pEndToDateString in varchar) as
  cursor all_tab_cursor is
    select a.owner, a.table_name, b.column_name
      from dba_tables a, dba_tab_columns b, dba_objects c
     where a.owner = b.owner
       and a.table_name = b.table_name
       and a.table_name = c.object_name
       --and a.owner in ('XXX')  --用戶可選
       and (b.data_type = 'DATE' or b.data_type like 'TIMESTAMP%')
       and c.object_type = 'TABLE'
     order by a.owner, a.table_name, b.column_id;
  refAllTab all_tab_cursor%rowtype;

  --------------

  sSql   varchar(4000);
  nCount number;

begin
  DBMS_OUTPUT.Enable(4000000);

  open all_tab_cursor;
  loop
    fetch all_tab_cursor
      into refAllTab;
    exit when all_tab_cursor%notfound;

    sSql := 'SELECT COUNT(1) FROM ' || refAllTab.Owner || '.' ||
            refAllTab.Table_Name || ' WHERE ' || refAllTab.Column_Name ||
            ' BETWEEN ' || pStartToDateString || ' AND ' || pEndToDateString;
    --DBMS_OUTPUT.PUT_LINE(sSql);
    execute immediate sSql
      into nCount;

    if nCount > 0 then
      DBMS_OUTPUT.PUT_LINE(refAllTab.Owner || '.' || refAllTab.Table_Name || '.' ||
                           refAllTab.Column_Name || ' = ' || nCount);
    end if;

  end loop;
  close all_tab_cursor;
end search_date_between;

 

    執行範例:blog

    exec search_string('測試');字符串

    exec search_string_like('包含測試');get

    exec search_number(100);

    exec search_number_between(100, 200);

    exec search_date('to_char(''2013-01-01'',''yyyy-mm-dd'')');

    exec search_date_between('to_char(''2013-01-01'',''yyyy-mm-dd'')','to_char(''2014-01-01'',''yyyy-mm-dd'')');

    以上存儲過程執行完畢後,會輸出格式文本:用戶.表名.字段名 = 記錄數,應用時根據實際狀況修改。

 

    轉載請註明原文地址:http://www.cnblogs.com/litou/p/3926881.html

相關文章
相關標籤/搜索