【问题标题】:PL / SQL to search a string in whole databasePL / SQL 在整个数据库中搜索字符串
【发布时间】:2015-02-03 12:36:58
【问题描述】:

不仅仅是一个问题,它是一个信息共享帖子。

我今天遇到了一种情况,我需要在应用程序的整个数据库中查找一个问题,但不知道它属于哪个表/列。

以下是我编写并用于帮助我提出建议的 PL/SQL 块。希望它可以帮助其他有类似要求的人。

Declare
  i   NUMBER := 0;
  counter_intable NUMBER :=0;
 BEGIN
     FOR rec IN (
        select 
             'select count(*) ' || 
             ' from '||table_name||
             ' where '||column_name||' like''%732-851%'' ' as sql_command
        from user_tab_columns
        where data_type='VARCHAR2'
     )
     LOOP
        execute immediate rec.sql_command into counter_intable;
        IF counter_intable != 0 THEN
            i := i + 1;
            DBMS_OUTPUT.put_line ('Match found using command ::' || rec.sql_command);
            DBMS_OUTPUT.put_line ('count ::' || counter_intable);
        END IF;

     END LOOP;

     DBMS_OUTPUT.put_line ('total commands matched :: ' || i);
 END;

将您的字符串替换为代码块中 732-851 的位置

【问题讨论】:

  • 将您的 PL/SQL 块的性能与我的答案进行比较。
  • 一个非常相似的解决方案已经发布为this question的答案。
  • 呃!我忘记了,几天前我什至在此处添加了相同的答案。我没有看到具体问题,不确定是否应该删除我的答案。
  • 我们有一个非常庞大的数据库,容量约为 2.5 TB,PL/SQL 块在 SQL 语句之前完成。
  • Hay Alex,希望我昨天能找到它,这会节省我一些时间和精力,因为我不是 DBA,不得不在互联网上一次又一次地查找语法和其他详细信息。 :( 感谢分享。

标签: database oracle search plsql oracle-sqldeveloper


【解决方案1】:

为什么要PL/SQL?您可以在 SQL 中使用 xmlsequence 执行相同的操作。

比如我要搜索值'KING'-

SQL> variable val varchar2(10)
SQL> exec :val := 'KING'

PL/SQL procedure successfully completed.

SQL> SELECT DISTINCT SUBSTR (:val, 1, 11) "Searchword",
  2    SUBSTR (table_name, 1, 14) "Table",
  3    SUBSTR (column_name, 1, 14) "Column"
  4  FROM cols,
  5    TABLE (xmlsequence (dbms_xmlgen.getxmltype ('select '
  6    || column_name
  7    || ' from '
  8    || table_name
  9    || ' where upper('
 10    || column_name
 11    || ') like upper(''%'
 12    || :val
 13    || '%'')' ).extract ('ROWSET/ROW/*') ) ) t
 14  ORDER BY "Table"
 15  /

Searchword  Table          Column
----------- -------------- --------------
KING        EMP            ENAME

SQL>

您可以搜索任何数据类型的值,请阅读SQL to Search for a VALUE in all COLUMNS of all TABLES in an entire SCHEMA

【讨论】:

  • 不错的解决方案,但我认为它不能在具有超过 100MB 数据的数据库上运行(这对于 Oracle 数据库来说非常少)。
  • 好吧,我尝试了一个包含 1.2 TB 数据的数据库。您能否详细说明您的观点。如果您的观点确实有效,我有兴趣进行一些性能测试。
  • 这只是我的一个假设。通常,当 XML 变得大于这些数字时,由于内存溢出,任何 DOM 操作(如 XPath 查询或样式表转换)都不再起作用。显然,Oracle 足够聪明,可以通过 WHERE 子句限制 XML。
  • 我相信每行匹配都会返回每个行集。因此,不应该有任何由于 xml 引起的内存溢出。我肯定会对其进行测试,并在我有一个具体的测试用例来证明我的观点时迟早让你知道。但是您的观点很有价值,感谢您的时间和精力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-05
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 2012-02-29
  • 2013-05-29
  • 1970-01-01
相关资源
最近更新 更多