這個需求比較冷門,但對於在某些特定的狀況下,仍是會有這樣的須要的。好在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'')');
以上存儲過程執行完畢後,會輸出格式文本:用戶.表名.字段名 = 記錄數,應用時根據實際狀況修改。