[Oracle]根据字段值全库搜索相关数据表和字段

这个需求比较冷门,但对于在某些特定的情况下,还是会有这样的需要的。好在Oracle实现还比较方便,用存储过程则轻松实现。

查询字符串:

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‘,‘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;

查询数字:

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_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

[Oracle]根据字段值全库搜索相关数据表和字段

时间: 2024-08-04 12:25:19

[Oracle]根据字段值全库搜索相关数据表和字段的相关文章

[SQL]取得数据库里的数据表、字段、型态、长度、数据结构等资讯

如果想动态做查询条件,或是撰写表单产生器,以及动态产生表单,可以利用以下语法,放到检视表里以供使用. 如果想动态做查询条件,或是撰写表单产生器,以及动态产生表单,可以利用以下语法,放到检视表里以供使用. 假设我数据库里有两个数据表分别为Departments和Employees如下: Departments 数据行名称 数据类型 长度 允许Null dno varchar 50 0 name varchar 50 0 manager varchar 50 0 budget int 4 0 Emp

【SQL Server】sql server更改了数据表的字段/新增数据表的字段 无法保存

sql server更改了数据表的字段/新增数据表的字段  无法保存 解决方法:进入 工具-->选项-->Designers-->表设计器和数据库设计器-->取消勾选   即可

MySQL中大数据表增加字段,通过增加索引实现

MySQL中大数据表增加字段,通过增加索引实现 普通的添加字段sql ALTER TABLE `table_name` ADD COLUMN `num` int(10) NOT NULL DEFAULT 0 AFTER `addtime`; 普通的添加索引sql ALTER TABLE `table_name` ADD INDEX `num` (`num`) ; 但是线上的一张表如果数据量很大呢,执行加字段操作就会锁表,这个过程可能需要很长时间甚至导致服务崩溃,那么这样操作就很有风险了. 在网上

取得数据库里的数据表、字段、型态、长度、数据结构等资讯 (SQL Server 2008)

取得数据库里的数据表.字段.型态.长度.数据结构等资讯 ?SELECT???????? dbo.sysobjects.name AS sTableName,?????????????????????????? dbo.syscolumns.name AS sColumnsName,?????????????????????????? dbo.syscolumns.prec AS iColumnsLength,?????????????????????????? dbo.syscolumns.co

SQL Server全库搜索(在所有表中查找内容)

SQL Server版本:SQL Server2008某个内容到底存储在数据库的哪个地方?无从下手时,可以使用全库查找.SQL Server在整个库的所有表的所有字段中查找内容,用到了临时表,游标循环. declare @Str nvarchar(max), @tableName varchar(50), @colName varchar(50), @rowCount int select a.name tableName, b.name Colname, 0 as IsFound into #

Java实体Date类型属性值无法保存到数据表对应字段的问题

项目框架: maven+springMVC+mybatis 实体属性: //推荐时间private java.util.Date recommendDate; 数据库字段: ALTER TABLE `resource`ADD COLUMN `RECOMMEND_DATE`  date NULL COMMENT '推荐时间'; 属性赋值: resource.setRecommendDate(DateUtils.getNowDate()); 相关方法: 获取现在时间 /** * 获取现在时间 * *

mysql全库备份恢复某个表

早上小红过来问我说网站的一个功能没了,看了下数据库,少了个表.好吧,心里mmp,开始恢复数据 环境: 全库备份 恢复某一个表 1.1 查看备份数据 [[email protected] mysql_backup]$ ls -lhtotal 16G-rw-r--r-- 1 root root 5.4G May 21 00:58 2018_05_21_00_30_01.all.sql.zip     ##找到了备份数据 1.2  查看备份文件类型 [[email protected] mysql_b

MS SQL Server数据库两个库之间相同数据表名内容批量对比方法

上一篇"导出记录数量对比-软件测试方法(一)",主要介绍数据导出结果记录数量和原始正常好库的记录数量精确对比,测试软件导出少数据的相关bug.本文测试方法旨在更精确比对表记录内部数据差异,记录数量的对比只是恢复准确率的必要条件,而记录内部的字段数据内容是否一致,才是比较的终极目标. 一. 测试目的:在很多情况下,数据导出是以记录数量来衡量是否齐全.在某些情况下,数据记录数量导出是一致的,但,记录内部数据却出现差异,比如某些数字字段,一旦出现差异,其结果将带来不准确.本测试大纲目的是比对

数据库设计之数据库,数据表和字段等的命名总结

数据库命名规则: 根据项目的实际意思来命名. 数据表命名规则: 1.数据表的命名大部分都是以名词的复数形式并且都为小写: 2.尽量使用前缀"table_": 3.如果数据表的表名是由多个单词组成,则尽量用下划线连接起来:但是不要超过30个字符,一旦超过30个字符,则使用缩写来缩短表名的长度: 字段命名规则: 1.首先命名字段尽量采用小写,并且是采用有意义的单词: 2.使用前缀,前缀尽量用表的"前四个字母+下划线组成": 3.如果字段名由多个单词组成,则使用下划线来进