为了账号安全,请及时绑定邮箱和手机立即绑定

搜索所有表中的所有字段以获得特定值(Oracle)

搜索所有表中的所有字段以获得特定值(Oracle)

繁花如伊 2019-06-15 13:33:48
搜索所有表中的所有字段以获得特定值(Oracle)是否可以在Oracle中搜索每个表的每个字段中的特定值?有些表中有数百个有数千行的表,所以我知道这需要很长时间来查询。但是我唯一知道的是,我想要查询的字段的值是1/22/2008P09RR8. <我尝试使用下面的语句来根据我认为应该命名的内容找到一个适当的列,但是它没有返回结果。SELECT * from dba_objects  WHERE object_name like '%DTN%'这个数据库上绝对没有文档,我也不知道这个字段是从哪里提取的。有什么想法吗?
查看完整描述

3 回答

?
米脂

TA贡献1836条经验 获得超3个赞

引用:

我尝试使用下面的语句来根据我认为应该命名的内容找到一个适当的列,但是它没有返回结果。

SELECT * from dba_objects WHERE
object_name like '%DTN%'

列不是对象。如果您的意思是您期望列名类似于‘%DTN%’,那么您想要的查询是:

SELECT owner, table_name, column_name FROM all_tab_columns WHERE column_name LIKE '%DTN%';

但是,如果‘DTN’字符串只是你的猜测,那可能是没有帮助的。

顺便问一下,您有多确定‘1/22/2008P09R8’是直接从单个列中选择的值?如果您根本不知道它是从哪里来的,那么它可能是几个列的连接,或者是某个函数的结果,或者是嵌套表对象中的一个值。因此,您可能在盲目地尝试检查每一列的值。您能不能从显示此值的任何客户端应用程序开始,并试图找出它用于获取该值的查询?

无论如何,diciu的答案给出了一种生成SQL查询的方法,以检查每个表的每一列的值。您还可以使用PL/SQL块和动态SQL在一个SQL会话中完成类似的操作。以下是一些仓促编写的代码:

    SET SERVEROUTPUT ON SIZE 100000

    DECLARE
      match_count INTEGER;
    BEGIN
      FOR t IN (SELECT owner, table_name, column_name
                  FROM all_tab_columns
                  WHERE owner <> 'SYS' and data_type LIKE '%CHAR%') LOOP

        EXECUTE IMMEDIATE
          'SELECT COUNT(*) FROM ' || t.owner || '.' || t.table_name ||
          ' WHERE '||t.column_name||' = :1'
          INTO match_count
          USING '1/22/2008P09RR8';

        IF match_count > 0 THEN
          dbms_output.put_line( t.table_name ||' '||t.column_name||' '||match_count );
        END IF;

      END LOOP;

    END;
    /

有一些方法可以使它更有效率。

在这种情况下,给定您要寻找的值,您可以清楚地删除任何类型为Number或Date类型的列,这将减少查询的数量。甚至可能将其限制为类型类似于‘%char%’的列。

可以构建每个表的一个查询,而不是每个列一个查询,如下所示:

SELECT * FROM table1
  WHERE column1 = 'value'
     OR column2 = 'value'
     OR column3 = 'value'
     ...
     ;


查看完整回答
反对 回复 2019-06-15
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

是的,你可以,你的DBA会讨厌你,会发现你会把你的鞋子钉在地上,因为这会导致大量的I/O,并且随着缓存的清除,数据库的性能真的会下降。

select column_name from all_tab_columns c, user_all_tables u where c.table_name = u.table_name;

首先。

我将从正在运行的查询开始,使用v$sessionv$sqlarea..这是基于甲骨文版本的改变。这将缩小空间,而不是击中一切。


查看完整回答
反对 回复 2019-06-15
  • 3 回答
  • 0 关注
  • 2096 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信