在 Oracle 数据库视图中查询特定文本的所有视图

Query all views for specific text in Oracle database views

我想知道是否有人有可以搜索所有视图以查找特定文本的查询。我们使用的数据库版本是 Oracle Database 12c。这只会是 运行 在我们的 dev/test 数据库中。

我是新来公司的,对这个数据库结构是新手,也是使用Oracle的新手。我过去只使用过 MSSQL。我找不到数据字典,总是不得不询问某物的含义或它所在的位置,这让我感觉很糟糕。

我在询问之前试图调查一些。我正在尝试了解所有列的含义以及所有数据连接到的位置。我愿意接受其他建议。

对于 SQL,我有一个可以在视图和列中搜索数据并且速度相当快的工具。我没有确切的时间。但是,我认为它类似于在 Oracle 中 运行ning 它,除非数据库与 运行ning 类似的东西可能不会 return 有点不同。我发现了一些搜索所有表的 Oracle 查询,但我无权访问任何表。我们获得访问权限的方式是:其他用户 > 用户 > 视图 > 然后对该视图进行查询。

我发现这个 link 我认为可能有用 - Oracle Search all tables all columns for string

当我 运行 接受答案中的第一个查询时,我收到此错误:

Error report -ORA-00932: inconsistent datatypes: expected - got CHAR
ORA-06512: at line 6
00932. 00000 - "inconsistent datatypes: expected %s got %s"
*Cause:
*Action:"` 

我要搜索的字符串包含数字和字母。前任。 123ABC

当我 运行 第二个查询时,我让它 运行 了四个小时,但仍然没有 returned。有什么办法可以加快速度吗?

我愿意接受任何其他问题、建议和帮助,为我指明正确的方向。

谢谢!

您必须了解,在整个数据库中搜索所有 CHAR(及其变体)数据类型列(因为“123ABC”是一个字符串)是一项繁琐且耗时的工作运行 进程。在一些相对较小的 table 秒内不需要时间;但是,在大型数据库上,确实需要很长时间。您不能使用任何索引,所以...请耐心等待。

此外,请注意代码(在 link 后面)搜索 ALL_TAB_COLUMNS 视图,该视图不仅包含您的 table 的列(由您拥有),还包含 一切 您有权访问的内容,其中包含各种用户。看一看;这是我在笔记本电脑上的 11gXE 数据库:

SQL> select owner, count(*) from all_tab_columns group by owner;

OWNER                            COUNT(*)
------------------------------ ----------
MDSYS                                 736
CTXSYS                                320
SYSTEM                                 54
APEX_040000                          3327
SCOTT                                  69
XDB                                    35
SYS                                 15211

7 rows selected.

SQL> select count(*) from user_tab_columns;

  COUNT(*)
----------
        69

SQL>

看出区别了吗?使用 ALL_TAB_COLUMNS,您正在搜索 ~20.000 列。在我自己的模式(和 USER_TAB_COLUMNS)中,只有 70 个。

因此,考虑切换到 USER_TAB_COLUMNS(如果这样做,请删除所有 OWNER 列引用)。


PL/SQL 过程(在这种情况下(关于您从 link 您发布的问题中获取的代码),匿名 PL/SQL 块)不会显示 任何事情直到结束。

或者,您可以创建一个“日志”table,一个自主事务存储过程(以便您可以插入日志 table 和 commit),这样您d 然后从另一个会话“跟踪”执行。像这样:

日志table 和过程:

SQL> create table search_log (table_name varchar2(30), column_name varchar2(30));

Table created.

SQL> create or replace procedure p_log (par_table_name in varchar2,
  2                                     par_column_name in varchar2)
  3  is
  4    pragma autonomous_transaction;
  5  begin
  6    insert into search_log (table_name, column_name)
  7      values (par_table_name, par_column_name);
  8    commit;
  9  end;
 10  /

Procedure created.

来自您发布的 link 的代码;切换到 USER_TAB_COLUMNS,搜索包含 'KING' 字符串的 table/column:

SQL> DECLARE
  2    match_count integer;
  3    v_search_string varchar2(4000) := 'KING';
  4  BEGIN
  5    FOR t IN (SELECT table_name, column_name
  6              FROM user_tab_columns
  7              WHERE data_type like '%CHAR%'
  8             )
  9    LOOP
 10      EXECUTE IMMEDIATE
 11        'SELECT COUNT(*) FROM '|| t.table_name||
 12        ' WHERE '||t.column_name||' = :1'
 13         INTO match_count
 14        USING v_search_string;
 15      IF match_count > 0 THEN
 16        --dbms_output.put_line( t.owner || '.' || t.table_name ||' '||t.column_name||' '||match_count );
 17        p_log(t.table_name, t.column_name);
 18      END IF;
 19    END LOOP;
 20  END;
 21  /

PL/SQL procedure successfully completed.

SQL> select * From search_log;

TABLE_NAME                     COLUMN_NAME
------------------------------ ------------------------------
EMP                            ENAME

SQL>

只找到一个 table; EMP 及其 ENAME 列。