Citat:
Jeg har forsøgt at bruge denne erklæring nedenfor for at finde en passende kolonne baseret på, hvad jeg synes, den skal hedde, men den gav ingen resultater.*
SELECT * from dba_objects WHERE
object_name like '%DTN%'
En kolonne er ikke et objekt. Hvis du mener, at du forventer, at kolonnenavnet er som '%DTN%', er den forespørgsel, du ønsker:
SELECT owner, table_name, column_name FROM all_tab_columns WHERE column_name LIKE '%DTN%';
Men hvis 'DTN'-strengen kun er et gæt fra din side, hjælper det sandsynligvis ikke.
Hvor sikker er du i øvrigt på, at '1/22/2008P09RR8' er en værdi valgt direkte fra en enkelt kolonne? Hvis du slet ikke ved, hvor det kommer fra, kan det være en sammenkædning af flere kolonner, eller resultatet af en funktion eller en værdi, der sidder i et indlejret tabelobjekt. Så du er måske på en vild jagt og prøver at tjekke hver kolonne for den værdi. Kan du ikke starte med hvilket klientprogram, der viser denne værdi, og prøve at finde ud af, hvilken forespørgsel den bruger for at få den?
Anyway, dicius svar giver én metode til at generere SQL-forespørgsler for at kontrollere hver kolonne i hver tabel for værdien. Du kan også lave lignende ting helt i én SQL-session ved hjælp af en PL/SQL-blok og dynamisk SQL. Her er noget hastigt skrevet kode til det:
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;
/
Der er nogle måder, du også kan gøre det mere effektivt på.
I dette tilfælde, givet den værdi, du leder efter, kan du klart eliminere enhver kolonne, der er af typen NUMBER eller DATE, hvilket ville reducere antallet af forespørgsler. Måske endda begrænse det til kolonner, hvor typen er som '%CHAR%'.
I stedet for én forespørgsel pr. kolonne kan du bygge én forespørgsel pr. tabel som denne:
SELECT * FROM table1
WHERE column1 = 'value'
OR column2 = 'value'
OR column3 = 'value'
...
;