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'
...
;