Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Przeszukaj wszystkie pola we wszystkich tabelach pod kątem określonej wartości (Oracle)

Cytat:

Próbowałem użyć tego stwierdzenia poniżej, aby znaleźć odpowiednią kolumnę na podstawie tego, jak moim zdaniem powinna zostać nazwana, ale nie zwróciło żadnych wyników.*

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

Kolumna nie jest obiektem. Jeśli masz na myśli, że oczekujesz, że nazwa kolumny będzie wyglądać jak „%DTN%”, zapytanie, które chcesz, to:

SELECT owner, table_name, column_name FROM all_tab_columns WHERE column_name LIKE '%DTN%';

Ale jeśli ciąg „DTN” jest tylko przypuszczeniem z twojej strony, to prawdopodobnie nie pomoże.

Swoją drogą, czy 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 pościgu 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, która wyświetla 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, aby sprawdzić wartość w każdej kolumnie każdej tabeli. Możesz również zrobić podobne rzeczy całkowicie w jednej sesji SQL, używając bloku PL/SQL i dynamicznego SQL. Oto kilka pospiesznie napisanego kodu:

    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 też kilka sposobów na zwiększenie wydajności.

W takim przypadku, biorąc pod uwagę szukaną wartość, możesz wyraźnie wyeliminować każdą kolumnę typu NUMBER lub DATE, co zmniejszyłoby liczbę zapytań. Może nawet ogranicz go do kolumn, w których typ to „%CHAR%”.

Zamiast jednego zapytania na kolumnę, możesz utworzyć jedno zapytanie na tabelę w następujący sposób:

SELECT * FROM table1
  WHERE column1 = 'value'
     OR column2 = 'value'
     OR column3 = 'value'
     ...
     ;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ślad SQL, zdarzenie 10046 w Oracle:trcsess, narzędzie tkprof

  2. Nazwy Oracle TNS nie wyświetlają się podczas dodawania nowego połączenia do SQL Developer

  3. jak odbudować kolejkę wf_java_deferred

  4. Java JDBC - Jak połączyć się z Oracle za pomocą tnsnames.ora

  5. Metoda gromadzenia:funkcje PRIOR i NEXT w bazie danych Oracle