在 Oracle 的整个架构的所有字段中搜索给定字符串

Posted

技术标签:

【中文标题】在 Oracle 的整个架构的所有字段中搜索给定字符串【英文标题】:Search for a given string in all fields of an entire schema for Oracle 【发布时间】:2011-04-06 06:09:42 【问题描述】:

我们如何在 Oracle 的整个架构的所有字段中搜索给定的字符串?

在 Oracle 中是否有执行上述操作的 sql 脚本?如果是,怎么做?

我们可以通过任何其他脚本来完成吗?

【问题讨论】:

【参考方案1】:

“ALL_TAB_COLUMNS”是一个系统表,具有所有表列数据类型等。

“USER_TAB_COLUMNS”是一个系统表,具有所有表列数据类型等(所有者是当前用户)。 (感谢雷内)

一个例子:

 SET SERVEROUTPUT ON SIZE 100000 -- maybe you have a lot of table and columns

    DECLARE
      matches INTEGER;
    BEGIN
      FOR columns IN (SELECT table_name, column_name FROM user_tab_columns where data_type = 'VARCHAR2') LOOP

        EXECUTE IMMEDIATE
          'SELECT COUNT(*) FROM '||t.table_name||' WHERE instr('||t.column_name||' , :1) > 0'
          INTO matches
          USING 'What you search';

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

      END LOOP;

    END;
    /

此查询将输出 table_name '' column_name'' 和计数,如果您有标准列和表名,您可以将查询更改为 IF 列 > 0 然后在循环中编写查询 UNION 并返回游标,或者返回一个表,

【讨论】:

我认为没有人使用 data_type 'VARCHAR' 了。因此,您可能希望更改此脚本以包含您用于存储字符串的数据类型。 VARCHAR2、CHAR、NVARCHAR2、CLOB。此外,如果您不想要完全匹配,您可能想要搜索 instr('what you search')>0。使用 user_tab_columns 将您的搜索限制为仅在您的架构中的表。 我猜应该是“IF 匹配 > 0 THEN”而不是“列”,不是吗? 如果你在 SQL Developer 中运行这个,别忘了enable DBMS Output【参考方案2】:

我们可以通过任何其他脚本来完成吗?

您可以将数据库作为文本转储到磁盘,然后使用grep

【讨论】:

以上是关于在 Oracle 的整个架构的所有字段中搜索给定字符串的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 django 过滤器为给定模型中的所有字段创建一般搜索

在 ORACLE 中搜索最长前缀的最快方法

oracle 数据库code 拼接字段如何转换成文字

在 mySQL 中的整个表中搜索字符串

搜索mySql中的所有字段

搜索mySql中的所有字段