搜索所有表中的所有字段以获得特定值(Oracle)

搜索所有表中的所有字段以获得特定值(Oracle)

是否可以在Oracle中搜索每个表的每个字段中的特定值?

有些表中有数百个有数千行的表,所以我知道这需要很长时间来查询。但是我唯一知道的是,我想要查询的字段的值是1/22/2008P09RR8. <

我尝试使用下面的语句来根据我认为应该命名的内容找到一个适当的列,但是它没有返回结果。

SELECT * from dba_objects 
WHERE object_name like '%DTN%'

这个数据库上绝对没有文档,我也不知道这个字段是从哪里提取的。

有什么想法吗?


繁花如伊
浏览 2108回答 3
3回答

米脂

引用:我尝试使用下面的语句来根据我认为应该命名的内容找到一个适当的列,但是它没有返回结果。SELECT&nbsp;*&nbsp;from&nbsp;dba_objects&nbsp;WHERE object_name&nbsp;like&nbsp;'%DTN%'列不是对象。如果您的意思是您期望列名类似于‘%DTN%’,那么您想要的查询是:SELECT&nbsp;owner,&nbsp;table_name,&nbsp;column_name&nbsp;FROM&nbsp;all_tab_columns&nbsp;WHERE&nbsp;column_name&nbsp;LIKE&nbsp;'%DTN%';但是,如果‘DTN’字符串只是你的猜测,那可能是没有帮助的。顺便问一下,您有多确定‘1/22/2008P09R8’是直接从单个列中选择的值?如果您根本不知道它是从哪里来的,那么它可能是几个列的连接,或者是某个函数的结果,或者是嵌套表对象中的一个值。因此,您可能在盲目地尝试检查每一列的值。您能不能从显示此值的任何客户端应用程序开始,并试图找出它用于获取该值的查询?无论如何,diciu的答案给出了一种生成SQL查询的方法,以检查每个表的每一列的值。您还可以使用PL/SQL块和动态SQL在一个SQL会话中完成类似的操作。以下是一些仓促编写的代码:&nbsp;&nbsp;&nbsp;&nbsp;SET&nbsp;SERVEROUTPUT&nbsp;ON&nbsp;SIZE&nbsp;100000 &nbsp;&nbsp;&nbsp;&nbsp;DECLARE &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;match_count&nbsp;INTEGER; &nbsp;&nbsp;&nbsp;&nbsp;BEGIN &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FOR&nbsp;t&nbsp;IN&nbsp;(SELECT&nbsp;owner,&nbsp;table_name,&nbsp;column_name &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;all_tab_columns &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE&nbsp;owner&nbsp;<>&nbsp;'SYS'&nbsp;and&nbsp;data_type&nbsp;LIKE&nbsp;'%CHAR%')&nbsp;LOOP &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXECUTE&nbsp;IMMEDIATE &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'SELECT&nbsp;COUNT(*)&nbsp;FROM&nbsp;'&nbsp;||&nbsp;t.owner&nbsp;||&nbsp;'.'&nbsp;||&nbsp;t.table_name&nbsp;|| &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'&nbsp;WHERE&nbsp;'||t.column_name||'&nbsp;=&nbsp;:1' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INTO&nbsp;match_count &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USING&nbsp;'1/22/2008P09RR8'; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IF&nbsp;match_count&nbsp;>&nbsp;0&nbsp;THEN &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&nbsp;t.table_name&nbsp;||'&nbsp;'||t.column_name||'&nbsp;'||match_count&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;END&nbsp;IF; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;END&nbsp;LOOP; &nbsp;&nbsp;&nbsp;&nbsp;END; &nbsp;&nbsp;&nbsp;&nbsp;/有一些方法可以使它更有效率。在这种情况下,给定您要寻找的值,您可以清楚地删除任何类型为Number或Date类型的列,这将减少查询的数量。甚至可能将其限制为类型类似于‘%char%’的列。可以构建每个表的一个查询,而不是每个列一个查询,如下所示:SELECT&nbsp;*&nbsp;FROM&nbsp;table1 &nbsp;&nbsp;WHERE&nbsp;column1&nbsp;=&nbsp;'value' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OR&nbsp;column2&nbsp;=&nbsp;'value' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OR&nbsp;column3&nbsp;=&nbsp;'value' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;... &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;

慕盖茨4494581

是的,你可以,你的DBA会讨厌你,会发现你会把你的鞋子钉在地上,因为这会导致大量的I/O,并且随着缓存的清除,数据库的性能真的会下降。select&nbsp;column_name&nbsp;from&nbsp;all_tab_columns&nbsp;c,&nbsp;user_all_tables&nbsp;u&nbsp;where&nbsp;c.table_name&nbsp;=&nbsp;u.table_name;首先。我将从正在运行的查询开始,使用v$session而v$sqlarea..这是基于甲骨文版本的改变。这将缩小空间,而不是击中一切。
打开App,查看更多内容
随时随地看视频慕课网APP