Announcement

Collapse
No announcement yet.

Wert in allen Tabellen und Feldern suchen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Wert in allen Tabellen und Feldern suchen

    Hallo!

    Ich habe die Aufgabe bekommen, dass ich mit einem

    Suchbegriff (Zeichen auch Numerisch)

    alle Tabellen einer Datenbank durchsuche.

    Es sollen nur jene Tabellen angezeigt werden, die diesen Suchbegriff, egal in welcher Spalte enthalten.


    Meine Überlegung ging in diese Richtung:

    SELECT table_name from ALL_TABLES WHERE ...


    danach fand ich keine weiteren Hilfen im Netz. Wie kann ich jetzt festlegen, dass alle Spalten durchsucht werden?


    Vielen Dank!


    Gruß Rene

  • #2
    Hi,

    das ist eine sehr undanbkare, blödsinnige und zeitraubende Aufgabe.
    Du musst für jede Tabelle ein SQL Statement generieren, welches alle Felder dieser Tabelle durchsucht. Die Bedingungen kannst dann mit OR verknüpfen.

    Dann muss noch geklärt werden, wass denn "Alle Tabellen" bedeutet. Es gibt in oracle (da du all_tables geschrieben hast, nehm ich mal an, Du verwendest oracle) hunderte von Systemtabellen, die Du mit sicherheit nicht durchsuchen sollst bzw. auch gar nicht darfst.

    Für die Generierung des Statements sind für dich die Views all_tables und all_tab_cols wichtig. Dabei wäre noch zu klären, ob Du nur alphanummerische Felder oder auch nummerische Felder durchsuchen sollst. Letzteres ist natürlich nur möglich wenn der Suchbegriff auch rein nummerisch ist.

    Dim
    Zitat Tom Kyte:
    I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

    Comment


    • #3
      Vielen Dank für die Antwort.

      Oracle ist richtig. Ich bin neu in dieser Materie. Meen Cheffe meent, dies soll nicht so schwierig sein.

      Sowohl alphanummerische Felder als auch nummerische Felder sollen durchsucht werden.

      Mir würde für den Anfang auch alphanummerisch reichen.

      Comment


      • #4
        Originally posted by Kohli View Post
        Vielen Dank für die Antwort.

        Oracle ist richtig. Ich bin neu in dieser Materie. Meen Cheffe meent, dies soll nicht so schwierig sein.

        Sowohl alphanummerische Felder als auch nummerische Felder sollen durchsucht werden.

        Mir würde für den Anfang auch alphanummerisch reichen.
        Hallo,

        Du wirst mit Dynamic SQL arbeiten müssen (Wobei ich bei einer solchen Aufgabe wahrscheinlich an eine Kündigung denken würde)

        Siehe hier :

        http://download.oracle.com/docs/cd/B...c.htm#LNPLS011

        - Du musst alle in Frage kommende Tabelle und Spalten über die Systemtabellen herausfinden (Owner nicht vergessen)
        - ...dort nur die entsprechenden Columns verwenden (typ varchar oder was du halt so brauchst)
        - ... Das Ganze über ein Dynamic SQL in einer PL/SQL Funktion in eine RIESEN-Abfrage packen
        -...und dann hoffen, dass du das System mit solchen Sachen nicht lahmlegst...


        meiner Meinung nach ist diese Anforderung allerdings *idiotisch*, wenn ich das mal so formulieren darf. Könnte es sein, dass sich da jemand in einem "generischen" Datenmodel verwirklicht hat ?

        Comment


        • #5
          Mal als kleiner Denkanstoß:
          Code:
          declare
           l_stmt varchar2(5000);
           l_searchValue varchar2(4000):='TEST';
          begin
          for tabs in(select table_name from user_tables) loop --Alle Tabellen des Schemas
            l_stmt:='SELECT * FROM '||tabs.table_name||' WHERE ';
            for cols in(select column_name from user_tab_cols where data_type in('NUMBER','VARCHAR2','CHAR') and table_name=tabs.table_name) loop --Alle Spalten einer Tabelle
              l_stmt:=l_stmt||'TO_CHAR('||cols.column_name||') LIKE ''%'||l_searchValue||'%'' OR ';
            end loop;
            l_stmt:=substr(l_stmt,1,length(l_stmt)-3);
            dbms_output.put_line('Suchstatement für '||tabs.table_name||'='||l_stmt);
          end loop;
          end;
          /
          Allerdings ist das eben extrem langsam. Für Tabellen mit ein paar tausen Einträgen dürfte das noch gehen, aber wenn es mal in die Hunderttausend oder Millionen geht, hast ein echtes Problem.
          Solche Abfragen lassen sich praktisch nicht tunen (wenn dann nur durch brachiale Hardwareerweiterung und Paralellisierung).

          Interessant wäre noch zu wissen, was den der Grund für eine solche "Suchfunktion" ist.

          Dim
          Zitat Tom Kyte:
          I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

          Comment


          • #6
            [QUOTE
            ... LIKE ''%'||l_searchValue||'%'' OR ';...
            [/QUOTE]

            - Der dürfte vorallem dem DBA Spass bereiten :-)

            Comment


            • #7
              Na ich hät auch noch ein UPPER drum rum bauen können

              Dim
              Zitat Tom Kyte:
              I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

              Comment


              • #8
                Danke

                Vielen lieben Dank euch beiden!


                Habe es noch gestern nach Feierabend zuhause mal getestet. Ich bekam keine Fehlermeldung, aber auch keinen Treffer in der Datenbank.


                Schreibe euch später, ob ich heut auf Arbeit mehr Erfolg hatte! ;-)


                Gruß Rene

                Comment


                • #9
                  Screenshot

                  Icke nochmal...

                  ich habe mal einen Screenshot vom Ergebnis gemacht.

                  (siehe Anhang)
                  Attached Files

                  Comment

                  Working...
                  X