Varrer todas as tabelas procurando um determinado valor

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
vistelina
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Qui, 22 Nov 2007 1:44 pm
Localização: São Paulo

Pessoal, boa tarde.

Eu preciso mudar para nulo todos os campos/Colunas que possuam
o valor por exemplo o valor 'AACT".

Esse valor pode estar em qualquer tabela...

Tem como fazer isso?

Obrigada
Vivi
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Boa tarde, tudo bem???

Uma dica seria:

1) Pegar o nome de todas as colunas em ALL_TAB_COLUMNS;

Selecionar tudo

SELECT *
  FROM ALL_TAB_COLUMNS;
2) Fazer um select dinâmico (ou um execute immediate) varrendo essas colunas e, num loop comparar isso ai.

Eu creio que dessa forma você consiga sim.

Vou ver se tenho algum exemplo e posto aqui, ok ?
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Você sabe ao menos o nome da coluna onde possa procurar estes valores?

Isso deve ficar pesado para o BANCO.

Mas, segue um exemplo:

Selecionar tudo

DECLARE 
  CURSOR CUR_CAMPOS
    IS 
      SELECT TABLE_NAME,
             COLUMN_NAME
        FROM ALL_TAB_COLUMNS
								WHERE DATA_TYPE = 'VARCHAR2';
BEGIN
  FOR X IN CUR_CAMPOS
  LOOP
    EXECUTE IMMEDIATE ' SELECT * FROM  ' || X.TABLE_NAME || ' WHERE ' || X.COLUMN_NAME || ' LIKE ''Alcool Hidratado%''';   	                     
  END LOOP;
END;   
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

Oi Vivi,
segue um script que faz isso pra você, mas como o Trevisolli disse, isso pode pesar no seu banco...
obs: é bom conferir se esses campos que serão encontrados aceitam valor nulo.

Selecionar tudo

DECLARE
   v_qtd          number(10);
   v_PALAVRA      VARCHAR2(100) := 'AACT';
   v_NOVA_PALAVRA VARCHAR2(100) := '';
BEGIN
   FOR reg IN (SELECT TABLE_NAME, COLUMN_NAME FROM user_tab_columns WHERE data_type='VARCHAR2' ORDER BY TABLE_NAME) LOOP
      dbms_output.put_line('Analisando tabela/coluna : '||reg.TABLE_NAME||'/'||reg.COLUMN_NAME);
      execute immediate
       'begin  update '||reg.TABLE_NAME||' set '||reg.COLUMN_NAME||' = '''||v_NOVA_PALAVRA||''' where '||reg.COLUMN_NAME||'='''||v_PALAVRA||''';
           if sql%rowcount >0 then
              dbms_output.put_line(''  Foi encontrado ''||sql%rowcount||'' ocorrencia(s) no campo '||reg.COLUMN_NAME||' da tabela '||reg.TABLE_NAME||' '');
           end if;
           commit;
        end;';
   END LOOP;
END;
[]'s
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

mas na pergunta ta parecendo que o campo vai ter o valor 'AACT' e não que o nome da coluna seja esta....

pelo menos foi isso q eu entendi...rs

dai pelo menos o nome da coluna você deve saber

abrçs
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

***ops completando....

porque como no exemplo que o tineks passou se você usar um like ai q o banco va sentar mesmo...
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 11 visitantes