見積もり:
以下のステートメントを使用して、名前を付ける必要があると思われるものに基づいて適切な列を見つけようとしましたが、結果が返されませんでした.*
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」が 1 つの列から直接選択された値であるという確信はありますか? どこから来ているのかわからない場合は、複数の列の連結、何らかの関数の結果、またはネストされたテーブル オブジェクトにある値である可能性があります。そのため、すべての列でその値をチェックしようと、大袈裟な追跡をしている可能性があります。この値を表示しているクライアント アプリケーションから始めて、それを取得するために使用しているクエリを特定することはできませんか?
とにかく、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'
...
;