COMO PUXAR O DADO DE UMA TABELA PARA OUTRA?

12/05/2017

0

Prezados, senhores! Estou com um problema terrível.

Comecei os meus estudos no âmbito da tecnologia da informação há pouco tempo e não tenho total franqueza com situações ligadas a Banco de Dados, por isso peço encarecidamente a ajuda de algum de vocês. Segue a situação:

Eu tenho duas tabelas no meu banco de dados, PCPRODUT E PCEMBALAGEM. PCPRODUT (considere dois campos essenciais: codprod, codbarras) é a tabela onde é registrado os dados cadastrais dos produtos do meu sistema e PCEMBALAGEM (codprod, codbarras) uma outra tabela onde eu registro o código de barras desse produto. O problema é que ao registrar o código de barras na tabela PCEMBALAGEM, a PCPRODUT não é atualizada no seu campo CODBARRAS automaticamente. De qual forma devo proceder para que ao registrar o código de barras em PCEMBALAGEM, automaticamente o campo codbarras na PCPRODUT seja atualizado de acordo com o codprod (código do produto) vinculado? Lembrando que o banco de dados é oracle.

De já, testifico meus agradecimentos e os parabenizo por essa iniciativa. Esse fórum na DevMedia tem me auxiliado bastante.

k.
Kelvin Moreira

Kelvin Moreira

Responder

Post mais votado

13/05/2017

Bom dia Kelvin
Se eu entendi direito você quer popular a tabela pcproduct sempre que ocorrer um novo registro no tabela pcembalagem, bom eu criei os objetos mencionados e abaixo segue o código da trigger veja se ajuda.:


CREATE OR REPLACE TRIGGER TR_INS_PRODUCT
BEFORE INSERT ON PCEMBALAGEM
FOR EACH ROW
BEGIN
INSERT INTO PCPRODUTO
(CODPROD, CODBARRA)
VALUES(
:NEW.CODPROD,
:NEW.CODBARRA
);
END;

Obrigado se precisar de mais alguma coisa só postar.

Mcosta.

Mario Costa

Mario Costa
Responder

Mais Posts

12/05/2017

Guilherme

Opa, por quê não criar uma TRIGGER para que seja feita atualização na tabela PCPRODUCT toda vez que feito um update na tabela PDEMBALAGEM?

Crie sua trigger e coloque algo assim nela:

UPDATE PCPRODUCT
SET PCPRODUCT.CODBARRAS=(
SELECT CODBARRAS FROM PCEMBALAGEM WHERE CODPROD = PCPRODUCT.CODPROD)


Esta query vai atualizar todos seus registros a cada update na tabela PCEMBALAGEM
Responder

13/05/2017

Kelvin Moreira

Opa, por quê não criar uma TRIGGER para que seja feita atualização na tabela PCPRODUCT toda vez que feito um update na tabela PDEMBALAGEM?

Crie sua trigger e coloque algo assim nela:

UPDATE PCPRODUCT
SET PCPRODUCT.CODBARRAS=(
SELECT CODBARRAS FROM PCEMBALAGEM WHERE CODPROD = PCPRODUCT.CODPROD)


Esta query vai atualizar todos seus registros a cada update na tabela PCEMBALAGEM


Bom, amigão...

Eu entendi a lógica e fiz a trigger com o seguinte código, como você me recomendou:

CREATE OR REPLACE TRIGGER TRG_ATUALIZACODBARRAS
        AFTER INSERT ON PCEMBALAGEM
        FOR EACH ROW
        
        BEGIN
             UPDATE PCPRODUT
             SET PCPRODUT.CODBARRAS = (SELECT CODBARRAS FROM PCEMBALAGEM WHERE PCEMBALAGEM.CODPROD = PCPRODUT.CODPROD);
        END TRG_ATUALIZACODBARRAS;


Entretanto, quando eu tento inserir o dado do código de barras, meu sistema não me permite salvar e alerta as mensagens que seguem:

"Ocorreu um erro ao tentar gravar registro.

Erro: ORA-04091: table SISTEMA.PCEMBALAGEM is mutating, trigger/function may not see it
ORA-06512: at "SISTEMA.TRG_ATUALIZACODBARRAS", line 2
ORA-04088: error during execution of trigger 'SISTEMA.TRG_ATUALIZACODBARRAS'"

Como posso resolver esse problema?
Responder

13/05/2017

Kelvin Moreira

Bom dia Kelvin
Se eu entendi direito você quer popular a tabela pcproduct sempre que ocorrer um novo registro no tabela pcembalagem, bom eu criei os objetos mencionados e abaixo segue o código da trigger veja se ajuda.:


CREATE OR REPLACE TRIGGER TR_INS_PRODUCT
BEFORE INSERT ON PCEMBALAGEM
FOR EACH ROW
BEGIN
INSERT INTO PCPRODUTO
(CODPROD, CODBARRA)
VALUES(
:NEW.CODPROD,
:NEW.CODBARRA
);
END;

Obrigado se precisar de mais alguma coisa só postar.

Mcosta.


Olá, Mario! Obrigado pela atenção e disposição em ajudar.

Não é exatamente isso que quero fazer. Vou detalhar a situação.

Eu tenho duas tabelas: pcprodut e pcembalagem. Na tabela pcprodut, eu insiro os dados cadastrais do produto e nela há o campo codbarras. No entanto, eu não desejo fazer o insert manual no campo codbarras da pcprodut e sim no campo codbarras da pcembalagem. Toda vez que for lançado no campo codbarras da pcembalagem, eu quero que o campo codbarras da pcprodut receba o mesmo valor. Acredito que seja através de um update mesmo, mas estou enfrentando esses problemas supracitados.
Responder

13/05/2017

Mario Costa

Boa tarde Kelvin seja se é isso que esta precisando até logo é boa tarde.

CREATE TABLE PCEMBALAGEM(
CODPROD NUMBER(6),
CODBARRA VARCHAR2(14)
);

CREATE TABLE PCPRODUCT(
CODPROD NUMBER(6),
CODBARRA VARCHAR2(14)
);

INSERT INTO PCEMBALAGEM VALUES (000001, 7895800144418);
UPDATE PCEMBALAGEM SET CODBARRA = 7895800144400 WHERE CODPROD = 1;

SELECT * FROM PCEMBALAGEM;
SELECT * FROM PCPRODUCT;

CREATE OR REPLACE TRIGGER TR_INS_PRODUCT
BEFORE INSERT OR UPDATE ON PCEMBALAGEM
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
IF INSERTING then
INSERT INTO PCPRODUCT
(CODPROD, CODBARRA)
VALUES
(:NEW.CODPROD, :NEW.CODBARRA);
END IF;
IF UPDATING THEN
UPDATE PCPRODUCT
SET CODBARRA = :NEW.CODBARRA
WHERE CODPROD = :OLD.CODPROD;
END IF;
END;
Responder

15/05/2017

Kelvin Moreira

Bom dia, Mario!

O seu código não foi exatamente o que eu precisava, mas me serviu de base e iluminou minha mente. Graças a vocês, resolvi o meu problema e foi mais fácil do que esperava. O código ficou assim...

CREATE OR REPLACE TRIGGER TRG_ATUALIZACODBARRAS
AFTER INSERT OR UPDATE ON PCEMBALAGEM
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW

BEGIN
          
     IF INSERTING THEN
         UPDATE PCPRODUT
         SET PCPRODUT.CODBARRAS = :NEW.CODBARRAS WHERE PCPRODUT.CODPROD = :NEW.CODPROD;
     END IF;
     
     IF UPDATING THEN
         UPDATE PCPRODUT
         SET PCPRODUT.CODBARRAS = :NEW.CODBARRAS WHERE PCPRODUT.CODPROD = :NEW.CODPROD;
     END IF;
END;


De novo, testifico meus agradecimentos a vocês que reservaram parte do dia de vocês para ajudar alguém.
Abraços.
k.
Responder

15/05/2017

Mario Costa

Boa tarde Kelvin.
Que que ajudou, bom é isso ai qualquer coisa posta ae.


Mcosta.
Responder

19/12/2019

Fabiano Santos

Bom dia, Mario!

O seu código não foi exatamente o que eu precisava, mas me serviu de base e iluminou minha mente. Graças a vocês, resolvi o meu problema e foi mais fácil do que esperava. O código ficou assim...

CREATE OR REPLACE TRIGGER TRG_ATUALIZACODBARRAS
AFTER INSERT OR UPDATE ON PCEMBALAGEM
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW

BEGIN
          
     IF INSERTING THEN
         UPDATE PCPRODUT
         SET PCPRODUT.CODBARRAS = :NEW.CODBARRAS WHERE PCPRODUT.CODPROD = :NEW.CODPROD;
     END IF;
     
     IF UPDATING THEN
         UPDATE PCPRODUT
         SET PCPRODUT.CODBARRAS = :NEW.CODBARRAS WHERE PCPRODUT.CODPROD = :NEW.CODPROD;
     END IF;
END;


De novo, testifico meus agradecimentos a vocês que reservaram parte do dia de vocês para ajudar alguém.
Abraços.
k.


Sei que já é um pouco tarde para responder, porém pode servir de consulta para outras pessoas.

O que o Kelvin fez é totalmente errado, pois a tabela principal é a PCPRODUT e não a PCEMBALAGEM. Ou seja, se ele alterar via rotina o código de barra no cadastro do produto (PCPRODUT) será criado automaticamente mais uma embalagem para o produto (PCEMBALAGEM) e não o inverso como ele fez.

Fica a dica para os próximos!!!
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar