Textsuche über gesamte Datenbank

Hallo,

gibt es eine Möglichkeit unter Oracle 9i über die gesamte Datenbank nach einem bestimmten Text zu suchen?

z.B. so in etwa:
SELECT * FROM allTables
WHERE (Textinhalt LIKE UPPER(’%test’)
OR Textinhalt LIKE UPPER(‚test%‘)
OR Textinhalt LIKE UPPER(’%test%’))

Es sollten also auch Textteile gefunden werden. Egal ob der Text am Anfang, Ende oder mittendrin vorkommt.

Gibt’s da eine SELECT-Möglichkeit oder ein Programm, das so was kann?

Ich hab’ nämlich keine Lust alle Tabelle der DB zu durchsuchen.

DANKE & Grüße

ANDI :smile:

  • Hmm direkt geht das so nicht. Wir haben dies und ähnliche Fragestellungen mithilfe der ORACLE.TEXT Option gelöst. Sind es nur ein paar wenige Felder in verschieden Tabellen, wäre es auch möglich, dies in eine „Suchtabelle“ zu schrieben (n-Felder --> 1 Feld) und dort zu suchen, allerdings weisst du dann nicht mehr, woher der Treffer kommt :smile:

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

leider ist es nicht ganz so einfach:

  1. Ich weiß nicht wie die ganzen Felder aller Tabellen heissen, in denen generell Text vorkommen könnte.
    Eine Suchtabelle fällt damit flach. Außerdem weiss ich nicht wirklich, in wie vielen Tabellen/Spalten der Text vorkommen kann.
  2. Ich muss die Spaltennamen wissen, da ich danach alle Felder, in denen der Text vorkommt bearbeiten muss.

Ach ja:
Gibt’s da vielleicht auch eine Möglichkeit? Der vorkommende Text soll nämlich im zweiten Schritt durch einen anderen ersetzt werden.

DANKE für die Mühe

ANDI :smile:

  • Hmm direkt geht das so nicht. Wir haben dies und ähnliche
    Fragestellungen mithilfe der ORACLE.TEXT Option gelöst. Sind
    es nur ein paar wenige Felder in verschieden Tabellen, wäre es
    auch möglich, dies in eine „Suchtabelle“ zu schrieben
    (n-Felder --> 1 Feld) und dort zu suchen, allerdings weisst
    du dann nicht mehr, woher der Treffer kommt :smile:
  • Dann gibt es die Möglichkeit, via Dynamic SQL und den Metadaten des Schemas dir einen SQL erstellen zulassen. Am besten machst du dies in einer PL/SQL Procedur. Der erste Ansazt wäre, sich in das in Frage kommende Schmema einzuloggen :

select * from USER_TAB_COLS
where DATA_TYPE =‚VARCHAR2‘

  • Dies gibt dir alle Felder vom Typ Varchar2 im aktuellen Schema und ihre zugehörige Tabellen (allerdings auch die Views…)

Wenn du dies in einen Cursor lädst und innerhalb eines Loops deinen SQL aufbaust, sollte es klappen

Dies ist aber :

  • Sehr umständlich
  • Eher nicht performant :smile:
  • Du brauchst dazu Zugriffsberechtigungen auf die DBA_VIEWS

Wenn es ein einmaliges Update sein soll, wäre es auf jeden Fall besser, die entsprechende Felder zu identifizieren und gezielt Update-Statements zu schreiben

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Ulrich,

für welche DBA_… Views benötigt er denn da Rechte? Erschließt sich mir nicht, kannst du das bitte erläutern?

Grüße,
Guido