sql >> Databasteknik >  >> RDS >> Oracle

Sök i alla fält i alla tabeller efter ett specifikt värde (Oracle)

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


  1. Använda INSERT med en PostgreSQL-databas med Python

  2. Använda Oracle JDeveloper Snippets med MySQL

  3. Rapportera mer detaljerat än vanligt – Microsoft Access

  4. Hur man tar bort en databas i cPanel