是否有可能在每个表的每个字段中搜索Oracle中的特定值?
在一些表中有数百个表有数千行,所以我知道这可能需要很长时间才能查询 . 但我唯一知道的是,我想要查询的字段的值是 1/22/2008P09RR8
. <
我已经尝试使用下面的这个语句根据我认为应该命名的内容找到一个合适的列,但它没有返回任何结果 .
SELECT * from dba_objects
WHERE object_name like '%DTN%'
这个数据库绝对没有文档,我不知道该字段的来源 .
有什么想法吗?
15 回答
我修改了Flood的脚本,为每个表执行一次,而不是为每个表的每一列执行,以便更快地执行 . 它需要Oracle 11g或更高版本 .
我会做这样的事情(生成你需要的所有选择) . 您可以稍后将它们提供给sqlplus:
它产生:
它的作用是 - 从
user_tables
每个user_tables
获取每个字段(来自desc)并从表中创建一个select *,其中field等于'val' .我对@Lalit Kumars的回答有以下问题,
解决方案是:
修改代码以使用LIKE查询不区分大小写,而不是查找完全匹配...
我没有关于SQL提示的简单解决方案 . 但是有很多像toad和PL / SQL Developer这样的工具都有一个用户可以输入要搜索的字符串的GUI,它将返回找到它的表/过程/对象 .
从this Blog post借用,略微增强和简化以下简单的SQL语句似乎很好地完成了这项工作:
我对上面的代码做了一些修改,如果你只搜索一个所有者,它可以更快地工作 . 您只需更改3个变量v_owner,v_data_type和v_search_string以适合您要搜索的内容 .
这是另一个修改版本,它将比较较低的子字符串匹配 . 这适用于Oracle 11g .
我知道这是一个古老的话题 . 但我看到一个问题的评论,询问是否可以在 SQL 中完成,而不是使用 PL/SQL . 所以想发布一个解决方案 .
以下演示是Search for a VALUE in all COLUMNS of all TABLES in an entire SCHEMA:
让我们在
SCOTT
架构中查找值KING
.让我们在
SCOTT
架构中查找值20
.有一些免费的工具可以进行这种搜索,例如,这个工作正常,源代码可用:https://sites.google.com/site/freejansoft/dbsearch
您需要Oracle ODBC驱动程序和DSN才能使用此工具 .
搜索整个数据库的过程:
执行声明
样本结果
是的,你可以和你的DBA讨厌你,并且会发现你将你的鞋子钉在地板上,因为这会导致大量的I / O并且在缓存清除时真正降低数据库性能 .
作为一个开始 .
我将从运行的查询开始,使用
v$session
和v$sqlarea
. 这基于oracle版本而变化 . 这将缩小空间范围,而不是打击一切 .如果我们知道表和列名称但想要找出每个模式出现字符串的次数:
引用:
列不是对象 . 如果您的意思是您希望列名称与'%DTN%'相似,那么您想要的查询是:
但如果“DTN”字符串只是你自己的猜测,那可能无济于事 .
顺便说一句,你有多确定'1/22 / 2008P09RR8'是直接从一列中选择的值?如果您根本不知道它来自哪里,它可能是多个列的串联,或某些函数的结果,或者是嵌套表对象中的值 . 因此,您可能正在进行疯狂的追逐尝试检查每个列的值 . 您是否可以从任何客户端应用程序显示此值开始,并尝试找出它用于获取它的查询?
无论如何,diciu的答案提供了一种生成SQL查询的方法,以检查每个表的每一列的值 . 您还可以使用PL / SQL块和动态SQL在一个SQL会话中完全执行类似的操作 . 这是一些草率编写的代码:
有一些方法可以使它更有效率 .
在这种情况下,给定您要查找的值,您可以清楚地删除任何NUMBER或DATE类型的列,这将减少查询的数量 . 甚至可能将其限制为类型为'%CHAR%'的列 .
您可以,而不是每列一个查询每个表构建一个查询,如下所示: