[Oracle]根据字段值全库搜索相关数据表和字段
2014-08-21 12:13
295 查看
这个需求比较冷门,但对于在某些特定的情况下,还是会有这样的需要的。好在Oracle实现还比较方便,用存储过程则轻松实现。
查询字符串:
查询包含字符串:
查询数字:
查询范围数字:
查询日期:
查询范围日期:
执行范例:
exec search_string('测试');
exec search_string_like('包含测试');
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'')');
以上存储过程执行完毕后,会输出格式文本:用户.表名.字段名 = 记录数,应用时根据实际情况修改。
转载请注明原文地址:/article/7028144.html
查询字符串:
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;
查询数字:
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;
查询范围数字:
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;
查询日期:
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;
查询范围日期:
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;
执行范例:
exec search_string('测试');
exec search_string_like('包含测试');
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'')');
以上存储过程执行完毕后,会输出格式文本:用户.表名.字段名 = 记录数,应用时根据实际情况修改。
转载请注明原文地址:/article/7028144.html
相关文章推荐
- Talend 将Oracle中数据导入到hive中,根据系统时间设置hive分区字段
- oracle 树查询 根据上级查询所有下级,根据下级查询相关上级数据
- oracle中,怎么根据字段名称,搜索的某个表的某个字段
- Oracle 删除重复数据只留一条 查询及删除重复记录的SQL语句 1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断 select * from 表 wher
- Oracle字段根据逗号分割查询数据
- ORACLE 根据字段返回拼接数据
- Oracle 删除重复数据只留一条 查询及删除重复记录的SQL语句 1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断 select * from 表 wher
- Oracle字段根据逗号分割查询数据的方法
- Oracle 根据字段查询相关表名
- oracle根据Date字段查询区间数据(转)
- MyBatis根据Map中key作为字段名,value作为字段值修改数据
- oracle 表结构、表字段、表中数据、主键约束的相关操作
- Oracle 表字段数据类型
- oracle 字段递增 表插入数据,id自动增1
- 修改oracle有数据字段长度
- 实现插入新数据字段自增长的触发器(Oracle)
- Oracle 9i R2数据库相关数据限值说明(原译)
- 18种根据屏幕字段找数据表的方法 rev1.1
- SQL 搜索所有包含特定字段的表的数据。
- 根据ID字段比较两个Access数据库中的数据表中的记录异同