oracle sql查询以跨所有架构查找电子邮件地址

oracle sql查询以跨所有架构查找电子邮件地址,oracle,loops,plsql,recursive-query,Oracle,Loops,Plsql,Recursive Query,我试图通过搜索模式“@abc.de”识别数据库模式中的所有表和列,理想情况下,此练习是 使用电子邮件模式(@abc.de)识别特定表格和相关列 选取该列表并交叉验证电子邮件地址是否有效 不幸的是,第1点非常困难 在寻找和试图找到 SQL代码 SET SERVEROUTPUT ON DECLARE l_cmd VARCHAR2 (2000); l_found INTEGER; BEGIN FOR eachcol IN ( SELECT *

我试图通过搜索模式“@abc.de”识别数据库模式中的所有表和列,理想情况下,此练习是

  • 使用电子邮件模式(@abc.de)识别特定表格和相关列
  • 选取该列表并交叉验证电子邮件地址是否有效
  • 不幸的是,第1点非常困难

    在寻找和试图找到

    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.
    

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

    删除无用的
    当其他人出现异常时。它隐藏了准确的错误点,因为第35行是
    RAISE

    然后,显示您当前使用的表和列名-使用
    DBMS\u输出。为此,请将行置于
    循环的正后方

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

    SQL> create table xxx ("!what ?" varchar2(10));
    
    Table created.
    
    你的代码以

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

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

    删除无用的
    ,当其他人出现异常时。它隐藏了准确的错误点,因为第35行是
    RAISE

    然后,显示您当前使用的表和列名-使用
    DBMS\u输出。为此,请将行置于
    循环的正后方

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

    SQL> create table xxx ("!what ?" varchar2(10));
    
    Table created.
    
    你的代码以

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

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

    它不工作,你能更新代码吗?我遇到了其他错误,我无法调试看不到的错误。它不工作。请更新代码好吗?我遇到了其他错误,我无法调试看不到的错误。在我工作过的大多数系统中,循环模式中的每一个
    varchar2
    列一次将花费超过一个人一生的时间。列名中真的没有线索吗?您可能还排除了太小而不能作为电子邮件地址的列-可能是
    a@b.cd
    大约是电子邮件地址的最小值,因此您需要寻找6个或更多字符作为开始。@WilliamRobertson-我可以通过指定所需的列来明确细化,但为了确保识别DWH架构中的所有电子邮件,但现实主义似乎很难,而且会消耗大量时间,而且查询永远不会结束,并且会重新运行大量错误。我将看看在我工作过的大多数系统中,是否可以找到列,在模式中的每一个
    varchar2
    列中循环一次要花费的时间超过人的一生。列名中真的没有线索吗?您可能还排除了太小而不能作为电子邮件地址的列-可能是
    a@b.cd
    大约是电子邮件地址的最小值,因此您需要寻找6个或更多字符作为开始。@WilliamRobertson-我可以通过指定所需的列来明确细化,但为了确保识别DWH架构中的所有电子邮件,但现实主义似乎很难,而且会消耗大量的时间,查询永远不会结束,还会运行大量的错误,我会看看是否能找到列