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

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

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

Aceitar