Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Alle Felder in allen Tabellen nach einem bestimmten Wert durchsuchen (Oracle)

Zitat:

Ich habe versucht, diese Anweisung unten zu verwenden, um eine geeignete Spalte zu finden, basierend auf dem, was ich denke, dass sie benannt werden sollte, aber es gab keine Ergebnisse zurück.*

SELECT * from dba_objects WHERE
object_name like '%DTN%'

Eine Spalte ist kein Objekt. Wenn Sie meinen, dass Sie erwarten, dass der Spaltenname wie '%DTN%' lautet, lautet die gewünschte Abfrage:

SELECT owner, table_name, column_name FROM all_tab_columns WHERE column_name LIKE '%DTN%';

Aber wenn die 'DTN'-Zeichenfolge nur eine Vermutung Ihrerseits ist, hilft das wahrscheinlich nicht weiter.

Übrigens, wie sicher sind Sie, dass „1/22/2008P09RR8“ ein Wert ist, der direkt aus einer einzelnen Spalte ausgewählt wurde? Wenn Sie überhaupt nicht wissen, woher es kommt, könnte es eine Verkettung mehrerer Spalten oder das Ergebnis einer Funktion oder ein Wert in einem verschachtelten Tabellenobjekt sein. Sie befinden sich also möglicherweise auf einer wilden Verfolgungsjagd und versuchen, jede Spalte auf diesen Wert zu überprüfen. Können Sie nicht mit der Clientanwendung beginnen, die diesen Wert anzeigt, und versuchen, herauszufinden, welche Abfrage sie verwendet, um ihn zu erhalten?

Wie auch immer, die Antwort von diciu gibt eine Methode zum Generieren von SQL-Abfragen, um jede Spalte jeder Tabelle auf den Wert zu überprüfen. Sie können ähnliche Dinge auch vollständig in einer SQL-Sitzung ausführen, indem Sie einen PL/SQL-Block und dynamisches SQL verwenden. Hier ist etwas hastig geschriebener Code dafür:

    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;
    /

Es gibt einige Möglichkeiten, wie Sie es auch effizienter machen könnten.

In diesem Fall können Sie angesichts des gesuchten Werts eindeutig jede Spalte vom Typ NUMBER oder DATE eliminieren, was die Anzahl der Abfragen verringern würde. Vielleicht sogar auf Spalten beschränken, deren Typ wie '%CHAR%' ist.

Anstelle einer Abfrage pro Spalte könnten Sie wie folgt eine Abfrage pro Tabelle erstellen:

SELECT * FROM table1
  WHERE column1 = 'value'
     OR column2 = 'value'
     OR column3 = 'value'
     ...
     ;