PL / SQL 在整个数据库中搜索字符串
Posted
技术标签:
【中文标题】PL / SQL 在整个数据库中搜索字符串【英文标题】:PL / SQL to search a string in whole database 【发布时间】:2015-02-03 12:36:58 【问题描述】:不仅仅是一个问题,它是一个信息共享帖子。
我今天遇到了一种情况,我需要在应用程序的整个数据库中查找一个问题,但不知道它属于哪个表/列。
以下是我编写并用于帮助我提出建议的 PL/SQL 块。希望它可以帮助其他有类似要求的人。
Declare
i NUMBER := 0;
counter_intable NUMBER :=0;
BEGIN
FOR rec IN (
select
'select count(*) ' ||
' from '||table_name||
' where '||column_name||' like''%732-851%'' ' as sql_command
from user_tab_columns
where data_type='VARCHAR2'
)
LOOP
execute immediate rec.sql_command into counter_intable;
IF counter_intable != 0 THEN
i := i + 1;
DBMS_OUTPUT.put_line ('Match found using command ::' || rec.sql_command);
DBMS_OUTPUT.put_line ('count ::' || counter_intable);
END IF;
END LOOP;
DBMS_OUTPUT.put_line ('total commands matched :: ' || i);
END;
将您的字符串替换为代码块中 732-851 的位置
【问题讨论】:
将您的 PL/SQL 块的性能与我的答案进行比较。 一个非常相似的解决方案已经发布为this question的答案。 呃!我忘记了,几天前我什至在此处添加了相同的答案。我没有看到具体问题,不确定是否应该删除我的答案。 我们有一个非常庞大的数据库,容量约为 2.5 TB,PL/SQL 块在 SQL 语句之前完成。 Hay Alex,希望我昨天能找到它,这会节省我一些时间和精力,因为我不是 DBA,不得不在互联网上一次又一次地查找语法和其他详细信息。 :( 感谢分享。 【参考方案1】:为什么要PL/SQL?您可以在 SQL 中使用 xmlsequence
执行相同的操作。
比如我要搜索值'KING'
-
SQL> variable val varchar2(10)
SQL> exec :val := 'KING'
PL/SQL procedure successfully completed.
SQL> SELECT DISTINCT SUBSTR (:val, 1, 11) "Searchword",
2 SUBSTR (table_name, 1, 14) "Table",
3 SUBSTR (column_name, 1, 14) "Column"
4 FROM cols,
5 TABLE (xmlsequence (dbms_xmlgen.getxmltype ('select '
6 || column_name
7 || ' from '
8 || table_name
9 || ' where upper('
10 || column_name
11 || ') like upper(''%'
12 || :val
13 || '%'')' ).extract ('ROWSET/ROW/*') ) ) t
14 ORDER BY "Table"
15 /
Searchword Table Column
----------- -------------- --------------
KING EMP ENAME
SQL>
您可以搜索任何数据类型的值,请阅读SQL to Search for a VALUE in all COLUMNS of all TABLES in an entire SCHEMA
【讨论】:
不错的解决方案,但我认为它不能在具有超过 100MB 数据的数据库上运行(这对于 Oracle 数据库来说非常少)。 好吧,我尝试了一个包含 1.2 TB 数据的数据库。您能否详细说明您的观点。如果您的观点确实有效,我有兴趣进行一些性能测试。 这只是我的一个假设。通常,当 XML 变得大于这些数字时,由于内存溢出,任何 DOM 操作(如 XPath 查询或样式表转换)都不再起作用。显然,Oracle 足够聪明,可以通过 WHERE 子句限制 XML。 我相信每行匹配都会返回每个行集。因此,不应该有任何由于 xml 引起的内存溢出。我肯定会对其进行测试,并在我有一个具体的测试用例来证明我的观点时迟早让你知道。但是您的观点很有价值,感谢您的时间和精力。以上是关于PL / SQL 在整个数据库中搜索字符串的主要内容,如果未能解决你的问题,请参考以下文章