Buscar una cadena de texto en un esquema completo de Oracle

En algunos casos, afortunadamente no demasiados, he tenido que buscar una cadena (normalmente algo relacionado con la configuración) en un esquema de la BD.

El asunto se complica cuando hay una cantidad de tablas ingente y además no hay forma de ponerse en contacto con el desarrollador, vamos un infierno.

Pues bueno para estos casos quiero compartir un script PL/SQL de cosecha propia (como casi todos los que pongo en el blog), que facilita el tema bastante:

Source   
DECLARE
sql_str VARCHAR2(1000);
sql_del VARCHAR2(1000);
cadena_buscar VARCHAR(200);
total_val number;
cursor c1 IS SELECT OWNER,TABLE_NAME,COLUMN_NAME,DATA_TYPE FROM dba_tab_columns WHERE owner='WL_VAPMGMT' AND DATA_TYPE IN ('CHAR','VARCHAR2');
BEGIN
cadena_buscar:='ceac7d09275562c6126a29405510e1ca';
FOR fila IN c1
LOOP
sql_str := 'SELECT COUNT(*) FROM '||fila.OWNER||'.'||fila.TABLE_NAME||' where '||fila.COLUMN_NAME||' like ''%'||cadena_buscar||'%''';
sql_del := 'DELETE FROM '||fila.OWNER||'.'||fila.TABLE_NAME||' where '||fila.COLUMN_NAME||' like '''||cadena_buscar||'''';
EXECUTE IMMEDIATE sql_str INTO total_val;
IF total_val>0 then
dbms_output.put_line(sql_str);
dbms_output.put_line(fila.OWNER||'.'||fila.TABLE_NAME||'.'||fila.COLUMN_NAME||' Aciertos '||total_val);
dbms_output.put_line(sql_del);
dbms_output.put_line('---');
end IF;
END LOOP;
END;

El PL/SQL busca dentro de todas las tablas del esquema WL_VAPMGMT (que hay que sustituirlo por el que venga al caso), la cadena asignada a la variable cadena_buscar.

Muestra en que tabla y columna se ha producido la coincidencia, cuantas y cual sería el DML para eliminar estas coincidencias.

Espero que os sea de utilidad…

One thought on “Buscar una cadena de texto en un esquema completo de Oracle

Deja un comentario