【发布时间】:2020-08-21 20:59:20
【问题描述】:
是否可以扫描架构中的每个表以查找 Oracle 中的特定值? ,逻辑上的小变化,我需要在架构中搜索特定列(SAMPLE_ABC),以便我可以进一步研究所有表都在使用此列 SAMPLE_ABC 以便我可以找到所需的结果
基本上我正在搜索一个数字示例 column_name - value-12345
我已经尝试了以下,但它运行了很长时间.......,我尝试搜索选项,但我无法
SET SERVEROUTPUT ON SIZE 100000
DECLARE
match_count INTEGER;
BEGIN
FOR t IN (SELECT owner, table_name, column_name
FROM all_tab_columns
WHERE owner <> 'SYS' and data_type LIKE '%CHAR%') LOOP
EXECUTE IMMEDIATE
'SELECT COUNT(*) FROM ' || t.owner || '.' || t.table_name ||
' WHERE '||t.column_name||' = :1'
INTO match_count
USING '12345';
IF match_count > 0 THEN
dbms_output.put_line( t.table_name ||' '||t.column_name||' '||match_count );
END IF;
END LOOP;
END;
/
【问题讨论】:
-
有没有可能,是的。实用吗,NO。为了有任何机会运行,您需要进一步限制模式列表。除了 SYS 之外,可能还有至少 10-15 个不包含用户数据的额外模式。
-
假设您生成的大多数
SELECTs 无论如何都会是全表扫描,那么更改 PL/SQL 块的逻辑以生成一个 @ 可能会快得多每个表 987654324@(而不是每列一个),所以看起来像这样:SELECT COUNT(*) FROM t WHERE a=:1 or b=:1 or c=:1 or...;如果您需要有关列的详细信息,请将COUNT(*)更改为SUM(CASE when a=:1 then 1 else 0) cnt_a, SUM(CASE when b=:1 then 1 else 0) cnt_b, ... -
你可以参考这个答案,其中一个表只搜索一次stackoverflow.com/a/9614022/1297792
标签: sql oracle oracle-sqldeveloper