Suche nach einem Wert in allen Tabellen eines Schemas mit PL/SQL

Manchmal kommt es vor, dass man nach einem String in der gesamten Datenbank suchen muss. Das ist keine einfache Angelegenheit.

Hier eine von mir weiterentwickelte Lösung, bei der PL/SQL Code erzeugt und in der Konsole ausgegeben wird. Diesen kann man anschließend ausführen lassen und erhält als Ergebnis die Tabellen angezeigt, wiederum auf der Konsole, die den gesuchten String beinhalten. Groß-Klein-Schreibung wird dabei absichtlich nicht beachtet.

Hier nun der Code, in dem noch der Suchwert angepasst werden muss:

 

DECLARE
 sql_statement VARCHAR2 ( 20000 CHAR );
 searchvalue VARCHAR2 ( 20000 CHAR ) := UPPER ( 'Suchstring' );
 existiert NUMBER := 0;
BEGIN
 DBMS_OUTPUT.put_line ( 'DECLARE' || CHR ( 10 ) || 'existiert NUMBER := 0;' || CHR ( 10 ) || 'BEGIN' || CHR ( 10 ) );
 FOR tabs IN (
 SELECT table_name
 FROM user_tables
 ) LOOP --Alle Tabellen des Schemas
 sql_statement := 'SELECT /*+ result_cache */ count (*) INTO existiert 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
  sql_statement := sql_statement || 'UPPER ( TO_CHAR(' || cols.column_name || ') ) LIKE ''%' || searchvalue || '%'' OR ';
 END LOOP;
 sql_statement := SUBSTR ( sql_statement, 1, LENGTH ( sql_statement ) - 3 );
 DBMS_OUTPUT.put_line ( 'BEGIN ' || sql_statement || ';' );
 DBMS_OUTPUT.put_line ( 'IF ( existiert >= 1 ) THEN DBMS_OUTPUT.put_line ( ''Gefunden in '
|| tabs.table_name
|| ''' ); existiert := 0; END IF;'
|| CHR ( 10 )
|| 'EXCEPTION WHEN OTHERS THEN NULL; ' || 'END;'
|| CHR ( 10 )
);
END LOOP;
 DBMS_OUTPUT.put_line ( 'END;' || CHR ( 10 ) || '/' );
END;
/

Schreibe einen Kommentar