【问题标题】:oracle sql query to find email address across all schemasoracle sql查询以在所有模式中查找电子邮件地址
【发布时间】:2021-02-04 18:48:03
【问题描述】:

我正在尝试使用搜索模式 '@abc.de' 识别跨数据库模式的所有表和列,理想情况下,此练习是

  1. 使用电子邮件模式 (@abc.de) 识别特定表和关联列
  2. 选择该列表并交叉验证电子邮件地址是否有效

不幸的是第1点非常困难

在搜索和尝试找到时

Search All Fields In All Tables For A Specific Value (Oracle)

SQL 代码

SET SERVEROUTPUT ON
DECLARE
    l_cmd     VARCHAR2 (2000);
    l_found   INTEGER;
BEGIN
    FOR eachcol IN (  SELECT *
                        FROM all_tab_cols a
                       WHERE a.data_type = 'VARCHAR2'
                        AND owner = 'schema_name'
                    ORDER BY table_name, column_name)
    LOOP
        l_cmd   :=
               'select count(*) c from '
            || eachcol.owner
            || '.'
            || eachcol.table_name
            || ' where '
            || LOWER (eachcol.column_name)
            || q'[ LIKE '%@abc%.de%' AND ROWNUM = 1]';

        EXECUTE IMMEDIATE l_cmd INTO l_found;

        IF l_found > 0
        THEN
            DBMS_OUTPUT.put_line (
                   RPAD (eachcol.owner || '.' || eachcol.table_name || '.' || eachcol.column_name, 92)
                || ' may contain email addresses'
            );
        END IF;
    END LOOP;
EXCEPTION
    WHEN OTHERS
    THEN
        DBMS_OUTPUT.put_line (l_cmd);
        DBMS_OUTPUT.put_line (SQLERRM);
        RAISE;
END;

我收到以下错误

Error report -
ORA-00911: invalid character
ORA-06512: at line 35
00911. 00000 -  "invalid character"
*Cause:    identifiers may not start with any ASCII character other than
           letters and numbers.  $#_ are also allowed after the first
           character.  Identifiers enclosed by doublequotes may contain
           any character other than a doublequote.  Alternative quotes
           (q'#...#') cannot use spaces, tabs, or carriage returns as
           delimiters.  For all other contexts, consult the SQL Language
           Reference Manual.

注意:我尝试了很多方法来获取电子邮件地址,但没有得到正确的查询逻辑,有什么建议吗?

【问题讨论】:

  • 在我工作过的大多数系统中,一次一个循环遍历模式中的每个varchar2 列将花费比人类一生更多的时间。列名真的没有线索吗?您还可以排除太小而不能作为电子邮件地址的列 - 大概 a@b.cd 大约是电子邮件地址的最小列,因此您首先要查找 6 个或更多字符。
  • @WilliamRobertson - 我可以明确地通过指定所需的列进行优化,但要确保识别跨 DWH 模式的所有电子邮件,但实际情况似乎很困难,并且会消耗大量时间,而且查询永远不会结束并重新运行无数次错误,我看看能不能找到列

标签: oracle loops plsql recursive-query


【解决方案1】:

删除无用的WHEN OTHERS 异常。它隐藏了确切的错误点,因为第 35 行是 RAISE

然后,显示您当前正在使用的表和列名 - 为此使用 DBMS_OUTPUT.PUT_LINE,放在 LOOP 后面。

一旦您遇到错误,程序将停止并显示引发错误的最后一个表/列。我推测是这样的:

SQL> create table xxx ("!what ?" varchar2(10));

Table created.

您的代码以

结尾
DECLARE
*
ERROR at line 1:
ORA-00936: missing expression
ORA-06512: at line 35

这并不完全是你得到的,但是 - 你会自己发现的。我不能,我没有你的桌子。

【讨论】:

  • 它不起作用,您可以在代码中更新吗?我遇到了其他错误
猜你喜欢
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
  • 2019-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
相关资源
最近更新 更多