COMO PUXAR O DADO DE UMA TABELA PARA OUTRA?
12/05/2017
0
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
Post mais votado
13/05/2017
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
Mais Posts
12/05/2017
Guilherme
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
13/05/2017
Kelvin Moreira
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?
13/05/2017
Kelvin Moreira
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.
13/05/2017
Mario Costa
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;
15/05/2017
Kelvin Moreira
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.
15/05/2017
Mario Costa
Que que ajudou, bom é isso ai qualquer coisa posta ae.
Mcosta.
19/12/2019
Fabiano Santos
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!!!
Clique aqui para fazer login e interagir na Comunidade :)