Citat:
Jag har försökt använda detta uttalande nedan för att hitta en lämplig kolumn baserat på vad jag tycker att den ska heta men det gav inga resultat.*
SELECT * from dba_objects WHERE object_name like '%DTN%'
En kolumn är inte ett objekt. Om du menar att du förväntar dig att kolumnnamnet ska vara som "%DTN%", är frågan du vill ha:
SELECT owner, table_name, column_name FROM all_tab_columns WHERE column_name LIKE '%DTN%';
Men om "DTN"-strängen bara är en gissning från din sida, kommer det förmodligen inte att hjälpa.
Förresten, hur säker är du på att '1/22/2008P09RR8' är ett värde som väljs direkt från en enda kolumn? Om du inte alls vet var den kommer ifrån kan det vara en sammanlänkning av flera kolumner, eller resultatet av någon funktion, eller ett värde som sitter i ett kapslat tabellobjekt. Så du kanske är på vild väg och försöker kontrollera varje kolumn för det värdet. Kan du inte börja med vilken klientapplikation som helst som visar detta värde och försöka ta reda på vilken fråga den använder för att få det?
Hur som helst, dicius svar ger en metod för att generera SQL-frågor för att kontrollera varje kolumn i varje tabell för värdet. Du kan också göra liknande saker helt och hållet i en SQL-session med ett PL/SQL-block och dynamisk SQL. Här är lite hastigt skriven kod för 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;
/
Det finns några sätt du kan göra det mer effektivt också.
I det här fallet, givet värdet du letar efter, kan du tydligt eliminera alla kolumner som är av typen NUMBER eller DATUM, vilket skulle minska antalet frågor. Kanske till och med begränsa det till kolumner där typen är som '%CHAR%'.
Istället för en fråga per kolumn kan du bygga en fråga per tabell så här:
SELECT * FROM table1
WHERE column1 = 'value'
OR column2 = 'value'
OR column3 = 'value'
...
;