Oracle
 sql >> Database >  >> RDS >> Oracle

Cerca in tutti i campi in tutte le tabelle un valore specifico (Oracle)

Citazione:

Ho provato a utilizzare questa istruzione di seguito per trovare una colonna appropriata in base a come penso dovrebbe essere denominata ma non ha restituito risultati.*

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

Una colonna non è un oggetto. Se intendi dire che ti aspetti che il nome della colonna sia come '%DTN%', la query che desideri è:

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

Ma se la stringa "DTN" è solo un'ipotesi da parte tua, probabilmente non sarà di aiuto.

A proposito, quanto sei certo che '1/22/2008P09RR8' sia un valore selezionato direttamente da una singola colonna? Se non sai affatto da dove proviene, potrebbe essere una concatenazione di più colonne, o il risultato di qualche funzione, o un valore che si trova in un oggetto tabella nidificato. Quindi potresti essere alla ricerca di un'oca selvaggia cercando di controllare ogni colonna per quel valore. Non puoi iniziare con qualsiasi applicazione client stia visualizzando questo valore e cercare di capire quale query sta utilizzando per ottenerlo?

Ad ogni modo, la risposta di diciu fornisce un metodo per generare query SQL per controllare il valore in ogni colonna di ogni tabella. Puoi anche fare cose simili interamente in una sessione SQL usando un blocco PL/SQL e un SQL dinamico. Ecco del codice scritto frettolosamente per questo:

    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;
    /

Ci sono anche alcuni modi in cui potresti renderlo più efficiente.

In questo caso, dato il valore che stai cercando, puoi eliminare chiaramente qualsiasi colonna che sia di tipo NUMBER o DATE, riducendo il numero di query. Forse anche limitarlo alle colonne in cui il tipo è come '%CHAR%'.

Invece di una query per colonna, puoi creare una query per tabella in questo modo:

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