PL / SQL 在整个数据库中搜索字符串

Posted

技术标签:

【中文标题】PL / SQL 在整个数据库中搜索字符串【英文标题】:PL / SQL to search a string in whole database 【发布时间】: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,不得不在互联网上一次又一次地查找语法和其他详细信息。 :( 感谢分享。 【参考方案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 引起的内存溢出。我肯定会对其进行测试,并在我有一个具体的测试用例来证明我的观点时迟早让你知道。但是您的观点很有价值,感谢您的时间和精力。

以上是关于PL / SQL 在整个数据库中搜索字符串的主要内容,如果未能解决你的问题,请参考以下文章

pl/sql developer 提示信息乱码

需要一个查询来从所有表/视图中搜索一个值(“数字”)

如何在 SQL 或 PL/SQL 中查找给定字符串(列数据)中的第 5 个字符? [关闭]

在 Oracle APEX PL/SQL 中传递变量

在 PL/SQL 中动态声明变量

为了在 PL/SQL 中对这些数据进行排序,使用啥数据结构?