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