On Tue, Oct 18, 2016 at 3:19 PM, Izaque Maciel <[email protected]>
wrote:

>   FOR rec IN
>     select date
> from generate_series(new.dtinicial::timestamp,
>                       new.dtfinal, '1 day') date
> where extract(dow from date) not in (0,6)
>   LOOP
>     INSERT INTO tarefa_itens (id, id_tarefaag, data_horafin,
>      data_horaexec, executada)
> VALUES ((select coalesce((max(ti.id) + 1), 1)
> chave from tarefa_itens ti),
>   new.id,
>   null,
>             rec.date       -- Aqui
>   'N');
>
>   END LOOP;
>

Além do que o Euler já comentou, eu tenho mais duas recomendações.

1. Essa é bem grave, usar `select coalesce(max(id)+1),1) ...` é uma prática
comum, mas pode ter consequências indesejáveis devido à problemas de
concorrência. Interessante que comentei sobre isso esses dia no último
PGDay Campinas [1]. Caso duas sessões tentem executar esse código ao mesmo
tempo, ambas vão recuperar o mesmo ID, tentando assim inserir o mesmo
valor. A solução nesse caso é simplesmente usar uma SEQUENCE, para isso
basta definir a coluna ID como SERIAL ou BIGSERIAL e simplesmente não usar
essa coluna no INSERT, deixando o PostgreSQL gerar o ID automaticamente (ou
então use DEFAULT ou nextval explícito).

2. Essa não é um problema, é mais uma pequena otimização. Eu também não
usaria LOOP, simplesmente faria INSERT ... SELECT.

O resultado seria mais ou menos assim:

    INSERT INTO tarefa_itens (
        id_tarefaag, data_horafin, data_horaexec, executada
    )
    SELECT
        NEW.id, null, g.dt, 'N'
    FROM
        generate_series(new.dtinicial::timestamp, new.dtfinal, '1 day') AS
g(dt)
    WHERE
        EXTRACT(DOW FROM g.dt) NOT IN (0,6);

Se quiser fazer o equivalente ao SERIAL na coluna que já existe, basta
executar:

    BEGIN;
    CREATE SEQUENCE tarefa_itens_id_seq;
    ALTER TABLE tarefa_itens ALTER id SET DEFAULT
nextval('tarefa_itens_id_seq');
    ALTER SEQUENCE tarefa_itens_id_seq OWNED BY tarefa_itens.id;
    SELECT setval('tarefa_itens_id_seq', max(id)) FROM tarefa_itens;
    COMMIT;

[1]
http://www.slideshare.net/matheus_de_oliveira/o-que-voc-acha-que-sabe-sobre-banco-de-dados

Atenciosamente,
-- 
Matheus de Oliveira
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a