Boa noite pessoal,  tenho duas tabelas:
"Produtos" e "ProdutosCodigoBarras"
Quero pegar o "Codigo" da tabela "Produtos" e inserir como "CodigoBarras"
na tabela "PRodutosCodigoBarras" lembrando que as regras são:
-o "Codigo" a ser inserido não pode estar sendo usado como "CodigoBArras"
-se houver o "Codigo" = ao "CodigoBarras" ele não insere

Função:

CREATE OR REPLACE FUNCTION InsereBarras() RETURNS SETOF VOID LANGUAGE
plpgsql AS $$
DECLARE
Tudo record;
Barra record;
Empresa integer :=1 ;
BEGIN
--Não existe codigo de barras para o produto, nem ean13 nem seu codigo como
codigo barras
FOR Tudo IN SELECT DISTINCT p."Codigo" FROM "Produtos" p
                                               LEFT JOIN
"ProdutosCodigoBarras" b on (b."IdProduto" = p."Codigo")
      WHERE p."Codigo" NOT IN (SELECT "IdProduto" FROM
"ProdutosCodigoBarras")
      AND p."Codigo"::text NOT IN (SELECT "CodigoBarras" FROM
"ProdutosCodigoBarras")
LOOP
INSERT INTO
"ProdutosCodigoBarras"("IdProduto","Ativo","IdEmpresa","CodigoBarras")
VALUES (Tudo."Codigo",TRUE,Empresa,Tudo."Codigo"::text);
END LOOP;
EXCEPTION WHEN UNIQUE_VIOLATION THEN
INSERT INTO
"ProdutosCodigoBarras"("IdProduto","Ativo","IdEmpresa","CodigoBarras","Codigo")
VALUES(Tudo."Codigo",TRUE,Empresa,Tudo."Codigo"::text,('999' ||
nextval('"ProdutosCodigoBarras_ID_seq"'))::bigint);
--Não tem codigo = codigobarras e não esta sendo usado como codigo barra
FOR Barra IN SELECT DISTINCT p."Codigo" FROM "Produtos" p
LEFT JOIN "ProdutosCodigoBarras" b on (b."IdProduto" = p."Codigo")
WHERE p."Codigo"::text NOT IN (SELECT "CodigoBarras" FROM
"ProdutosCodigoBarras")
and p."Codigo" NOT IN (SELECT DISTINCT p."Codigo" FROM "Produtos" p
LEFT JOIN "ProdutosCodigoBarras" b on (b."IdProduto" = p."Codigo") WHERE
p."Codigo" NOT IN (SELECT "Codigo" FROM "ProdutosCodigoBarras")
AND p."Codigo" NOT IN (SELECT "IdProduto" FROM "ProdutosCodigoBarras"))
LOOP
INSERT INTO
"ProdutosCodigoBarras"("IdProduto","Ativo","IdEmpresa","CodigoBarras")
VALUES(Barra."Codigo",TRUE,Empresa,Barra."Codigo"::text);
END LOOP;
END;
$$

SELECT InsereBarras();


Me retornar o seguinte erro:


ERRO:  duplicar valor da chave viola a restrição de unicidade
"PK_ProdutosCodigoBarras"
DETAIL:  Chave ("Codigo")=(-1) já existe.
CONTEXT:  comando SQL "INSERT INTO
"ProdutosCodigoBarras"("IdProduto","Ativo","IdEmpresa","CodigoBarras")
VALUES(Barra."Codigo",TRUE,Empresa,Barra."Codigo"::text)"
PL/pgSQL function inserebarras() line 25 at comando SQL

********** Error **********

ERRO: duplicar valor da chave viola a restrição de unicidade
"PK_ProdutosCodigoBarras"



Porém quando faço a consulta

select * from "ProdutosCodigoBarras" WHERE "Codigo" = -1

não retorna nada, o que poderia ser?

PostgreSQL 9.2


-- 
*Bruno da Cunha Felipe*





Enviado com MailTrack
<https://mailtrack.io/install?source=signature&lang=pt&[email protected]&idSignature=24>
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a