Zacytować:
Próbowałem użyć tego oświadczenia poniżej, aby znaleźć odpowiednią kolumnę na podstawie tego, jak myślę, że powinna zostać nazwana, ale nie zwróciła ona żadnych wyników. *
SELECT * from dba_objects WHERE
object_name like '%DTN%'
Kolumna nie jest obiektem. Jeśli masz na myśli, że spodziewasz się, że nazwa kolumny będzie wyglądać jak „% DTN%”, żądane zapytanie to:
SELECT owner, table_name, column_name FROM all_tab_columns WHERE column_name LIKE '%DTN%';
Ale jeśli ciąg „DTN” jest tylko domysłem z Twojej strony, prawdopodobnie to nie pomoże.
Swoją drogą, na ile masz pewność, że „1/22 / 2008P09RR8” jest wartością wybraną bezpośrednio z jednej kolumny? Jeśli w ogóle nie wiesz, skąd pochodzi, może to być konkatenacja kilku kolumn, wynik jakiejś funkcji lub wartość znajdująca się w zagnieżdżonym obiekcie tabeli. Więc możesz być w pogoni za dziką gęsią, próbując sprawdzić każdą kolumnę pod kątem tej wartości. Czy nie możesz zacząć od dowolnej aplikacji klienckiej wyświetlającej tę wartość i spróbować dowiedzieć się, jakiego zapytania używa, aby ją uzyskać?
W każdym razie odpowiedź diciu podaje jedną metodę generowania zapytań SQL w celu sprawdzenia wartości w każdej kolumnie każdej tabeli. Możesz również wykonać podobne czynności całkowicie w jednej sesji SQL, używając bloku PL / SQL i dynamicznego SQL. Oto pośpiesznie napisany kod:
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;
/
Jest kilka sposobów na zwiększenie wydajności.
W takim przypadku, biorąc pod uwagę szukaną wartość, można wyraźnie wyeliminować każdą kolumnę typu LICZBA lub DATA, co zmniejszyłoby liczbę zapytań. Może nawet ogranicz to do kolumn, w których typ jest taki jak „% CHAR%”.
Zamiast jednego zapytania na kolumnę, możesz zbudować jedno zapytanie na tabelę w następujący sposób:
SELECT * FROM table1
WHERE column1 = 'value'
OR column2 = 'value'
OR column3 = 'value'
...
;