On 06/05/2015 12:22, Matheus de Oliveira wrote:
On Tue, May 5, 2015 at 3:10 PM, Matheus Saraiva
<matheus.sara...@gmail.com <mailto:matheus.sara...@gmail.com>> wrote:
/*UPDATE "VendasItens" SET (produto_vendasitens,
quantidade_vendasitens) = produto.* FROM unnest(f_produtos) AS
produto WHERE venda_vendasitens = f_idvenda;*/
Infelizmente essa sintaxe não é aceita ainda, há discussões para
implantar algo semelhante em versões futuras.
Hoje você teria que fazer:
UPDATE "VendasItens"
SET (produto_vendasitens, quantidade_vendasitens) =
(produto.produto_vendasitens, produto.quantidade_vendasitens)
FROM unnest(f_produtos) AS produto
WHERE venda_vendasitens = f_idvenda;
Ou:
UPDATE "VendasItens"
SET produto_vendasitens = produto.produto_vendasitens,
quantidade_vendasitens = produto.quantidade_vendasitens
FROM unnest(f_produtos) AS produto
WHERE venda_vendasitens = f_idvenda;
Foi dessa forma que fiz a segunda tentativa, só que existe um pequeno
porém. /*produto_vendasitens */e /*venda_vendasitens*/ formam a chave
primária dessa tabela. Sendo assim a combinação entre eles não pode se
repetir.
Com o UPDATE dessa forma ele pegará o primeiro item do vetor e colocará
em em todos os lugares onde a cláusula WHERE for satisfeita, depois fará
a mesmo coisa com o segundo item do vetor, com o terceiro, quarto, e
assim até o ultimo. Mesmo que não existisse restrições de chave o
resultado não seria o desejado.
Se tivesse um vetor com ['(2,20)', '(5,6)', '(9,1)',
'(20,4)']::integer[] e o valor de f_idvenda fosse = 30. O resultado
final seria:
id_venda | produto_venda | quantidade_venda
30 | 20 | 4
30 | 20 | 4
30 | 20 | 4
30 | 20 | 4
30 | 20 | 4
Na forma correta o UPDATE deve ser feito apenas uma vez para cada
elemento do vetor.
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral