【问题标题】:How to check particular data in all schema如何检查所有模式中的特定数据
【发布时间】:2020-10-07 13:39:03
【问题描述】:

这是否可以从 sql developer 中的所有模式中找到特定数据。我的搜索应该类似于 sql developer 中的“查找数据库对象”选项。

【问题讨论】:

  • 您想在架构中每个适用表的每一行中查找一个标量值?
  • @JeffHolt 是的..

标签: oracle plsql oracle-sqldeveloper


【解决方案1】:

有可能吗?当然。但除了玩具模式之外,它的成本会非常高。

您很可能需要使用动态 SQL(您可能使用 XML 查询完成同样的事情)。一个简单的实现会做类似的事情

DECLARE
  l_search_string varchar2(1000) := 'foo';
  l_sql           varchar2(4000);
  l_cnt           integer;
BEGIN
  for c in (select *
              from user_tab_columns
             where data_type in ('CHAR', 'VARCHAR2'))
  loop
    l_sql := 'SELECT COUNT(*) FROM ' || c.table_name ||
             ' WHERE ' || c.column_name || ' = :1 ';
    EXECUTE IMMEDIATE l_sql
       INTO l_cnt
      USING l_search_string;

    IF( l_cnt > 0 )
    THEN
      dbms_output.put_line( l_search_string || ' found in column ' ||
                              c.column_name || ' in table ' ||
                              c.table_name );
    END IF;
  end loop;
END;

您可以通过为每个表而不是每列构建一个 COUNT 查询来提高效率,但这将是一个更复杂的构建语句。您可以为 l_search_numberl_search_date 搜索数字或日期列执行类似的过程。您可以通过处理区分大小写的表名或列名来使代码更加健壮(为了简单起见,我避免双引号)。您可以做一些比将结果写入dbms_output 更有用的事情。

但是,从性能的角度来看,您将不得不读取数据库中每个表中的每一行来执行此操作,这在大多数实际系统中将非常缓慢。一般来说,这也是一件没有多大意义的事情。例如,如果您正在搜索您知道是人名的特定字符串,除非您的架构设计得非常糟糕,否则您几乎可以肯定地查看架构并识别少数可能包含人名的表和列。如果有人将姓名存储在car 表的model 列中,那么搜索每个表中的每一列是没有意义的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 2015-12-26
    • 2019-11-01
    • 2021-06-13
    • 1970-01-01
    • 2022-11-21
    • 2012-09-26
    相关资源
    最近更新 更多