Tenho uma tabela que ao inserir dados ela precisa disparar uma trigger para coletar os dados dela e de outra tabela (ambas estão relacionadas por uma ID) e inserir em outra tabela, quando eu tento fazer isso a trigger acusa que a tabela é mutante e dá erro. Alguém pode dar uma força?
Olha o código da minha trigger:
Código:
create or replace trigger insert_tabela_c
after insert on tabela_b
for each row
declare
data date;
peso number(10,4);
precisao varchar(1);
maquina number(6);
produto number(5);
begin
select cod_aca, cod_maquina
into produto,
maquina
from tabela_a
where amo_codigo = :new.amo_codigo;
select ame.ame_data, ame.ame_peso, ame.ame_precisao
into data,
peso,
precisao
from tabela_b ame
where amo_codigo = :new.amo_codigo;
insert into tabela_c(data_med, peso, precisao, cod_maquina, cod_aca)
values(data, peso, precisao, maquina, produto);
end insert_tabela_c;
Caso a resolução não tenha sido uma daques soluções apresentadas nos links, pelo Gori, por favor poste como resolveu, para que os demais possam ter como referência caso necessitem.
create or replace trigger insert_medicoes
after insert on amostragem_medicao
for each row
declare
maquina number(6);
produto number(5);
begin
select cod_aca, cod_maquina
into produto,
maquina
from amostragem
where amo_codigo = :new.amo_codigo;
insert into medicoes2(data_med, peso, precisao, cod_maquina, cod_aca)
values(:new.ame_data, :new.ame_peso, :new.ame_precisao, maquina, produto);
end insert_medicoes;
E ai!!!!!
Estou me aventurando por esse mundo do Oracle e isso ta trazendo uma dor de cabeça enorme pois estou querendo montar um trigger de uma tabela que alimenta uma segunda com apenas dois campos e não estou conseguindo...exemplo:
Tenho as tabelas TT e XX.
Os campos da tabela TT são: ref_user int e dt_login date, isso quando for inserido um registro nessa tabela preciso q a trigger dispare jogando as informações na segunda XX q tem os seguintes campos: dd date e tt int;
Como sou marinheiro de primeira viagem gostaria muito de um auxilio da galera...
Obrigado pelas dicas Travisolli...!!!
Mas estou quebrando a cabeça para numa coisa q acredito que é muito facil mas realmente não estou conseguindo andar nisso...de uma olhada e vê se consegue me ajudar:
create or replace trigger tr_tt
after insert or update on tt
for each row
declare
ref_user int;
dt_login date;
begin
select ref_user, dt_login
into = tt, xx
from tt
where ref_user = new_user , dt_login = new_login
go
CREATE OR REPLACE TRIGGER TR_INSERE_LOG
BEFORE
INSERT OR UPDATE
ON EMP
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
DECLARE
V_SEQ NUMBER(04) := 0;
V_TP_ATU VARCHAR2(01);
BEGIN
IF INSERTING
THEN
V_TP_ATU := 'I';
ELSIF UPDATING
THEN
V_TP_ATU := 'U';
END IF;
SELECT MAX(SEQ)+1 --- AQUI PODERIA SER UMA SEQUENCE TB.
INTO V_SEQ
FROM T_LOG;
INSERT INTO T_LOG
VALUES (V_SEQ,
:NEW.EMPNO,
SYSDATE,
V_TP_ATU);
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001, 'Erro ao popular tabela de log (T_LOG) : ' || SQLERRM);
END;
declare
ref_user varchar(25);
dt_login varchar(12);
begin
select count(*),count(*)
into ref_user,dt_login
from TT;
declare
tt varchar(25);
dd varchar(12);
begin
insert into XX
values (ref_use,:new.tt,dt_logins,:new.dd);
end;
end;
CREATE OR REPLACE TRIGGER TBU_ENCERRAPROGNOSTICO
BEFORE UPDATE OF arquivado1, arquivado2, arquivado3
ON SAPC.PROCESSO
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
vlnPROG NUMBER;
BEGIN
SELECT NVL(COUNT(cod_interno),0)
INTO vlnPROG
FROM SAPC.PROCESSO
WHERE (cod_interno = :NEW.cod_interno)
AND PROB_EXITO In (1,2);
IF(vlnPROG > 0) THEN
IF(:OLD.arquivado1||:OLD.arquivado2||:OLD.arquivado3 <> 'N' AND :NEW.arquivado1||:NEW.arquivado2||:NEW.arquivado3 = 'S') THEN
RAISE_APPLICATION_ERROR(-20003,'Não é permitido o encerramento de processo com prognóstico PROVÁVEL ou POSSÍVEL');
END IF;
END IF;
END;