Observações:
- Criei este procedimento pois as vezes precisamos saber algo do tipo "onde será que o sistema usa o ID 177?" ou então "onde será que o sistema cadastrou a descrição Fulano01?"
- Basta substituir os campos p_* e executar sendo que o resultado sairá no Output.
- Caso esteja utilizando um usuário que seja o owner das tabelas, fica melhor mudar os cursores para USER_TABLES e USER_TAB_COLUMNS ao invés de DBA_TABLES e DBA_TAB_COLUMNS pois assim vai eliminar muitas consultas desnecessárias em tabelas de outros esquemas.
- Este é um procedimento que passa por todas as tabelas, então não espere que seja rápido.
DECLARE
--========================================================--
-- PARAMETROS
--========================================================--
p_tipo_campo VARCHAR2(160) := 'VARCHAR2'; -- Tipo de valor (VARCHAR2, NUMBER, DATE...)
p_parametro VARCHAR2(256) := 'CPG'; -- Valor a consultar
p_comparacao VARCHAR2(10) := '='; -- '=' ou 'LIKE'
--========================================================--
-- TIPOS
--========================================================--
TYPE ref_cursor IS REF CURSOR;
c_cursor ref_cursor;
--========================================================--
-- CURSORES
--========================================================--
-- Tabelas
CURSOR c_tabs IS
SELECT owner,
table_name
FROM dba_tables;
v_owner dba_tables.owner%TYPE;
v_tabela dba_tables.table_name%TYPE;
-- Colunas
CURSOR c_cols(pc_owner dba_tables.owner%TYPE,
pc_tabela dba_tables.table_name%TYPE,
pc_tipo_campo dba_tab_columns.data_type%TYPE) IS
SELECT column_name
FROM dba_tab_columns u
WHERE table_name = pc_tabela
AND owner = pc_owner
AND u.data_type = pc_tipo_campo;
v_coluna dba_tab_columns.column_name%TYPE;
--========================================================--
-- VARIAVEIS GERAIS
--========================================================--
v_sql VARCHAR2(1000);
v_aux VARCHAR2(300);
BEGIN
--========================================================--
-- Busca as tabelas
--========================================================--
OPEN c_tabs;
LOOP
FETCH c_tabs
INTO v_owner, v_tabela;
EXIT WHEN c_tabs%NOTFOUND;
--========================================================--
-- Busca as colunas
--========================================================--
OPEN c_cols(v_owner,
v_tabela,
p_tipo_campo);
LOOP
FETCH c_cols
INTO v_coluna;
EXIT WHEN c_cols%NOTFOUND;
--========================================================--
-- Se os campos são VARCHAR2 então coloca tudo em maiúsculo
--========================================================--
IF p_tipo_campo = 'VARCHAR2' THEN
v_coluna := upper(v_coluna);
p_parametro := upper(p_parametro);
END IF;
--========================================================--
-- Alimenta o select do cursor
--========================================================--
v_sql := 'SELECT ' || v_coluna || ' FROM ' || v_tabela || ' WHERE ' || v_coluna || ' ' ||
p_comparacao || ' :p_parametro';
--========================================================--
-- Faz a consulta
--========================================================--
BEGIN
OPEN c_cursor FOR v_sql
USING p_parametro;
FETCH c_cursor
INTO v_aux;
--========================================================--
-- Se encontrou, mostra no output
--========================================================--
IF c_cursor%FOUND THEN
dbms_output.put_line(v_tabela || '.' || v_coluna || ' = ' || v_aux);
END IF;
CLOSE c_cursor;
EXCEPTION
WHEN OTHERS THEN
CLOSE c_cursor;
--dbms_output.put_line(sqlerrm); /* Descomentar se quiser ver o erro */
END;
END LOOP;
CLOSE c_cols; -- Colunas
END LOOP;
CLOSE c_tabs; -- Tabelas
END;