【发布时间】:2021-02-04 18:48:03
【问题描述】:
我正在尝试使用搜索模式 '@abc.de' 识别跨数据库模式的所有表和列,理想情况下,此练习是
- 使用电子邮件模式 (@abc.de) 识别特定表和关联列
- 选择该列表并交叉验证电子邮件地址是否有效
不幸的是第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