在我的Oracle数据库中,我有大约2K个表,我想找到其中包含电子邮件的表和列名。
条件:可能不是列名中有email
标记,但列包含的值是<something>@<anything>.<tail>
。
从以前的类似线程的帮助下,它是运行没有任何输出
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 = 'SEARCHSCHEMANAME'
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 '%@%.%' 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;
字符串
输出:
2条答案
按热度按时间uqdfh47h1#
如果它不产生任何输出,则:
我稍微修改了你的代码
user_tab_cols
中选择数据(不想尝试all_tab_cols
)BEGIN-EXCEPTION-END
块,它处理可能的异常,但让循环继续(为什么我要在出错时停止执行?)不,我希望它继续)它在我的模式中起作用,所以我认为它也应该在你的模式中起作用(除非你遇到我在开始时提到的三种可能性中的一种或多种)。
字符串
测试结果:
型
kknvjkwl2#
1.使用带引号的标识符来确保标识符的大小写正确(而不是使用
LOWER
和无引号的标识符,Oracle会隐式地将其转换回大写,这似乎毫无意义);1.您还可以检查其他数据类型,包括
CHAR
,NVARCHAR2
和NCHAR
;和/或1.确保启用了
DBMS_OUTPUT
:就像这样:
字符串
fiddle