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