GARANTIR DESCONTO

Fórum TRIGGER PARA INSERÇÃO CASO UM CAMPO TENHA UM DETERMINADO VALOR #459033

21/10/2013

0

PRECISO DESENVOLVER UMA TRIGER CASO O CAMPO CÓDIGO DA TABELA1 RECEBA DETERMINADO VALOR (EXEMPLO 82 TEREI QUE INSERIR NA TABELA2 OS VALORES 209 E 210).
Kaio

Kaio

Responder

Posts

21/10/2013

Deivison Melo

Exemplo verificando se está em modo de INSERTING (inserindo) ou UPDATING (UPDATE)

CREATE OR REPLACE TRIGGER trg_insere_valor_em_outra_tabela
BEFORE  INSERT OR UPDATE  ON sua_tabela
REFERENCING
 NEW AS NEW
 OLD AS OLD
FOR EACH ROW

DECLARE
	cursor cExemplo is
		select SYSDATE data
		  from sys.dual;

  vcExemplo cExemplo%rowtype;
BEGIN
	open  cexemplo;
	fetch cexemplo into vcexemplo;
	close cexemplo;
	--
	IF INSERTING THEN
	  if vcexemplo.data = sysdate  THEN -- aqui comparei o valor do cursor com o sysdate, no meu caso sempre vai dar igual
	    INSERT INTO tabela_desejada(campos...)
           VALUES(:NEW.campo1, :NEW.campo2, :NEW.campoN ...); 
    end if;

  -- Se estiver em modo de inserção (insert)
	ELSE
		IF UPDATING THEN
      -- Se estiver em modo de alteração (update)
		END IF;
	END IF;
END;
/




Exemplo sem se está em modo de INSERTING (inserindo) ou UPDATING (UPDATE)
CREATE OR REPLACE TRIGGER trg_insere_valor_em_outra_tabela
BEFORE  INSERT OR UPDATE  ON sua_tabela
REFERENCING
 NEW AS NEW
 OLD AS OLD
FOR EACH ROW

DECLARE
	cursor cExemplo is
		select SYSDATE data
		  from sys.dual;

  vcExemplo cExemplo%rowtype;
BEGIN
	open  cexemplo;
	fetch cexemplo into vcexemplo;
	close cexemplo;
	if vcexemplo.data = sysdate  THEN -- aqui comparei o valor do cursor com o sysdate, no meu caso sempre vai dar igual
	  INSERT INTO tabela_desejada(campos...)
          VALUES(:NEW.campo1, :NEW.campo2, :NEW.campoN ...); 
  end if;
END;
/



PS. Evite o Mutating na trigger

Nesse tópico você entenderá o que é e como evitar!

[url]http://glufke.net/oracle/viewtopic.php?t=96[/url]

Qualquer dúvida estou à disposição!

Abração e bons códigos!!
Responder

Gostei + 0

23/10/2013

Kaio

Boa Tarde Deivison! Resumindo eu preciso que quando inserir um projeto para um determinado user essa trigger possa inserir os centros de custos vinculados ao projeto, assim inserindo o código do usuário que foi inserido na tabela do projeto também na tabela de centro de custo. esse codigo abaixo comentando o if esta inserindo mas preciso que ele insere quando eu determinar o código.

CREATE OR REPLACE TRIGGER trg_insere_outra_tabela
AFTER INSERT OR UPDATE  ON PROJETO
REFERENCING
 NEW AS NEW
 OLD AS OLD
FOR EACH ROW
 
DECLARE
    cursor cExemplo is
        select * 
        from PROJETO;
 
  vcExemplo cExemplo%rowtype;
BEGIN
    open  cexemplo;
    fetch cexemplo into vcexemplo;
    close cexemplo;
    
IF INSERTING THEN 
  -- IF vcExemplo.cod_projeto = 82  THEN -- aqui eh o valor que esta sendo inserido na tabela projeto
        INSERT INTO centro_custo (cod_usuario --quero que esse codigo venha da tabela projeto ,campo2,campo3,campo4,cod_centro_custo)
        VALUES(1153,2,4,4,219);  -- aki inserir o codigo 1153 do usuario manual , o 219 eh  o codigo do centro de custo.
 -- end if;
end if;
end;


Abraço
Responder

Gostei + 0

23/10/2013

Deivison Melo

Quando vc fala: [b]preciso que ele insere quando eu determinar o código[/b] a que está se referindo exatamente?

Já não consta um if ali verificando o código?

Suponhamos que esse código será lido de uma informação gravada em uma tabela, certo?

Qual sua dúvida atual??
Responder

Gostei + 0

23/10/2013

Kaio

Sim, quando insiro o projeto 82, na tabela centro de custo não esta inserindo nenhum valor!

Comentando o if deixando sem condição a trigger funciona corretamente, o que pode estar errado?
Responder

Gostei + 0

30/10/2013

Deivison Melo

O cursor:

cursor cExemplo is
        select * 
        from PROJETO


Está retornando valor?

Pois se você remove o if e o valor é inserido provavelmente ou está trazendo um valor diferente de 82 ou está vindo nulo...

Abração e bons códigos!

Responder

Gostei + 0

30/10/2013

Kaio

DEIVISON FIZ SEM O CURSOR FICOU ASSIM!

CREATE OR REPLACE TRIGGER mgcli.trg_insere_cc_por_projeto
  AFTER INSERT OR UPDATE ON PROJETO_USUARIO
  REFERENCING NEW AS NEW OLD AS OLD
  FOR EACH ROW

DECLARE

BEGIN

  IF INSERTING THEN
    -- SE PROJETO FOR IGUAL A 82
    IF :new.pro_in_reduzido = 82 THEN
      INSERT INTO CCUSTO_USUARIO
        (CODIGO_USU,
         CAMPO2,
         CAMPO3,
         CAMPO4,
         CAMPO5)
      VALUES
        (:new.codigo_usu, 2, 4, 4, 219);
   END IF;
END;


MUITO OBRIGADO PELA DICA!
ABRAÇOS.
Responder

Gostei + 0

30/10/2013

Deivison Melo

Blz amigo qualquer coisa estamos por aqui!

estarei finalizando o tópico!

forte abraço e bons códigos!!
Responder

Gostei + 0

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

Aceitar