【发布时间】:2020-10-07 13:39:03
【问题描述】:
这是否可以从 sql developer 中的所有模式中找到特定数据。我的搜索应该类似于 sql developer 中的“查找数据库对象”选项。
【问题讨论】:
-
您想在架构中每个适用表的每一行中查找一个标量值?
-
@JeffHolt 是的..
标签: oracle plsql oracle-sqldeveloper
这是否可以从 sql developer 中的所有模式中找到特定数据。我的搜索应该类似于 sql developer 中的“查找数据库对象”选项。
【问题讨论】:
标签: oracle plsql oracle-sqldeveloper
有可能吗?当然。但除了玩具模式之外,它的成本会非常高。
您很可能需要使用动态 SQL(您可能使用 XML 查询完成同样的事情)。一个简单的实现会做类似的事情
DECLARE
l_search_string varchar2(1000) := 'foo';
l_sql varchar2(4000);
l_cnt integer;
BEGIN
for c in (select *
from user_tab_columns
where data_type in ('CHAR', 'VARCHAR2'))
loop
l_sql := 'SELECT COUNT(*) FROM ' || c.table_name ||
' WHERE ' || c.column_name || ' = :1 ';
EXECUTE IMMEDIATE l_sql
INTO l_cnt
USING l_search_string;
IF( l_cnt > 0 )
THEN
dbms_output.put_line( l_search_string || ' found in column ' ||
c.column_name || ' in table ' ||
c.table_name );
END IF;
end loop;
END;
您可以通过为每个表而不是每列构建一个 COUNT 查询来提高效率,但这将是一个更复杂的构建语句。您可以为 l_search_number 或 l_search_date 搜索数字或日期列执行类似的过程。您可以通过处理区分大小写的表名或列名来使代码更加健壮(为了简单起见,我避免双引号)。您可以做一些比将结果写入dbms_output 更有用的事情。
但是,从性能的角度来看,您将不得不读取数据库中每个表中的每一行来执行此操作,这在大多数实际系统中将非常缓慢。一般来说,这也是一件没有多大意义的事情。例如,如果您正在搜索您知道是人名的特定字符串,除非您的架构设计得非常糟糕,否则您几乎可以肯定地查看架构并识别少数可能包含人名的表和列。如果有人将姓名存储在car 表的model 列中,那么搜索每个表中的每一列是没有意义的。
【讨论】: