引用:
I’ve tried using this statement below
to find an appropriate column based on
what I think it should be named but it
returned no results.*
06000
列不是对象。如果你的意思是你希望列名称像’%DTN%’,你想要的查询是:
SELECT owner, table_name, column_name FROM all_tab_columns WHERE column_name LIKE '%DTN%';
但是如果’DTN’字符串只是一个猜测你的一部分,这可能是没有帮助。
顺便问一下,你是否确定“1/22 / 2008P09RR8”是直接从单列中选择的值?如果你根本不知道它来自哪里,它可能是几个列的连接,或一些函数的结果,或一个值位于嵌套表对象中。所以你可能在一个疯狂的追逐试图检查每个列的值。你不能从任何客户端应用程序显示这个值开始,并试图找出它正在使用什么查询获得它?
无论如何,diciu的答案给出一个生成SQL查询的方法来检查每个表的每一列的值。你也可以在一个SQL会话中使用PL / SQL块和动态SQL完成类似的事情。这里有一些匆忙写的代码:
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 '1/22/2008P09RR8';
IF match_count > 0 THEN
dbms_output.put_line( t.table_name ||' '||t.column_name||' '||match_count );
END IF;
END LOOP;
END;
/
有一些方法,你可以使它更有效率。
在这种情况下,给定您要查找的值,可以清楚地删除任何NUMBER或DATE类型的列,这将减少查询的数量。也许甚至将它限制在类型为“%CHAR%”的列。
而不是每列一个查询,您可以像这样为每个表构建一个查询:
SELECT * FROM table1
WHERE column1 = 'value'
OR column2 = 'value'
OR column3 = 'value'
...
;