sql >> Databáze >  >> RDS >> Oracle

Vyhledat konkrétní hodnotu ve všech polích ve všech tabulkách (Oracle)

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


  1. Uživatelská oprávnění MySQL na sdílených serverech

  2. Jaké je použití GO v SQL Server Management Studio &Transact SQL?

  3. Zařízení Django selhalo a uvádí DatabaseError:hodnota je příliš dlouhá pro typový znak se liší (50)

  4. Číslo řádku na skupinu v mysql