見積もり:
以下のステートメントを使用して、名前を付ける必要があると思うものに基づいて適切な列を見つけようとしましたが、結果が返されませんでした。*
SELECT * from dba_objects WHERE
object_name like '%DTN%'
列はオブジェクトではありません。列名が '%DTN%'のようになると予想する場合、必要なクエリは次のとおりです。
SELECT owner, table_name, column_name FROM all_tab_columns WHERE column_name LIKE '%DTN%';
しかし、 'DTN'文字列が推測にすぎない場合は、おそらく役に立たないでしょう。
ところで、 '1/22 / 2008P09RR8'が単一の列から直接選択された値であることをどの程度確信していますか?それがどこから来ているのかまったくわからない場合は、いくつかの列の連結、何らかの関数の結果、またはネストされたテーブルオブジェクトにある値である可能性があります。そのため、すべての列でその値をチェックしようとする野生のガチョウ追跡をしている可能性があります。この値を表示しているクライアントアプリケーションから始めて、それを取得するために使用しているクエリを特定することはできませんか?
とにかく、diciuの答えは、すべてのテーブルのすべての列の値をチェックするSQLクエリを生成する1つの方法です。PL / SQLブロックと動的SQLを使用して、1つの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%'のような列に制限することもできます。
列ごとに1つのクエリを作成する代わりに、次のようにテーブルごとに1つのクエリを作成できます。
SELECT * FROM table1
WHERE column1 = 'value'
OR column2 = 'value'
OR column3 = 'value'
...
;