Em 5 de maio de 2010 17:38, Antonio Prado
<[email protected]> escreveu:
> Em Qua, 2010-05-05 às 17:24 -0300, Osvaldo Kussama escreveu:
>> Em 5 de maio de 2010 16:00, Antonio Prado
>> <[email protected]> escreveu:
>> > Tenho em minha base de dados registros do tipo decimal que possuem valor
>> > Nulo. O correto é que estes possuam valor Zero.
>> >
>> > É possível corrigir isto com única instrução ou terei que fazer uma para
>> > cada tabela?
>> >
>>
>>
>> Numa única instrução não é possível de acordo com o padrão SQL. Você
>> terá que fazer um UPDATE para cada tabela.
>>
>> O que você pode fazer é uma função que consulte o catálogo e monte
>> dinamicamente este UPDATE para cada tabela de seu banco.
>
> Pode me dar um exemplo de como eu faço isto?
>
>> Aproveite e altere suas tabelas especificando NOT NULL sempre que
>> necessário de acordo com seus requisitos.
>
> Sim.
>


Algo to tipo:

CREATE FUNCTION sua_funcao() RETURNS void AS $$
DECLARE
   _rec_tab RECORD;
   _rec_col RECORD;
BEGIN
   FOR _rec_tab IN SELECT * FROM information_schema.tables WHERE
table_type = 'BASE TABLE' LOOP
      _cmd_upd := 'UPDATE ' || table_schema || '.' || table_name || ' SET ';
      _campos := '';
      _cond := '';

      FOR _rec_col IN SELECT * FROM information_schema.columns WHERE
table_schema = ' || _rec_tab.table_schema || ' AND table_name = ' ||
_rec_tab.table_name || ' AND is_nullable = ''YES'' AND data_type =
''numeric''' LOOP
         IF _campos <> '' THEN
            _campos := _campos || ', ';
            _cond := _cond || ' OR ';
          END IF;
          _campos := _campos || _rec_col.column_name || ' = coalesce('
|| _rec_col.column_name || ',0)';
          _cond := _cond || _rec_col. column_name || ' IS NULL';
      END LOOP;
      IF _campos <> '' THEN
         RAISE NOTICE ' Tabela alterada: %.%', _rec_tab.table_schema,
_rec_tab.table_name;
         EXECUTE _cmd_upd || campos || ' WHERE ' || _cond || ';';
      END IF;
      RETURN;
   END LOOP;
END;
$$ LANGUAGE plpgsql;

Osvaldo
PS: Não testada.
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a