Citace:
Pokusil jsem se použít toto prohlášení níže k nalezení vhodného sloupce na základě toho, jak si myslím, že by se měl jmenovat, ale nevrátilo žádné výsledky.*
SELECT * from dba_objects WHERE object_name like '%DTN%'
Sloupec není objekt. Pokud chcete říct, že očekáváte, že název sloupce bude jako '%DTN%', požadovaný dotaz je:
SELECT owner, table_name, column_name FROM all_tab_columns WHERE column_name LIKE '%DTN%';
Ale pokud je řetězec 'DTN' z vaší strany jen odhad, pravděpodobně to nepomůže.
Mimochodem, jak jste si jisti, že '1/22/2008P09RR8' je hodnota vybraná přímo z jednoho sloupce? Pokud vůbec nevíte, odkud pochází, může to být zřetězení několika sloupců nebo výsledek nějaké funkce nebo hodnota sedící ve vnořeném objektu tabulky. Takže můžete být na divoké husě a snažit se zkontrolovat každý sloupec na tuto hodnotu. Nemůžete začít s jakoukoli klientskou aplikací, která zobrazuje tuto hodnotu, a pokusit se zjistit, jaký dotaz používá k jejímu získání?
Odpověď diciu každopádně poskytuje jednu metodu generování SQL dotazů pro kontrolu hodnoty v každém sloupci každé tabulky. Podobné věci můžete také provádět zcela v jedné relaci SQL pomocí bloku PL/SQL a dynamického SQL. Zde je nějaký narychlo napsaný kód:
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;
/
Existuje několik způsobů, jak to můžete zefektivnit.
V tomto případě, vzhledem k hodnotě, kterou hledáte, můžete jasně odstranit jakýkoli sloupec typu NUMBER nebo DATE, což by snížilo počet dotazů. Možná to dokonce omezit na sloupce, kde je typ jako '%CHAR%'.
Namísto jednoho dotazu na sloupec můžete vytvořit jeden dotaz na tabulku takto:
SELECT * FROM table1
WHERE column1 = 'value'
OR column2 = 'value'
OR column3 = 'value'
...
;