Jump to content
cfreis01

[Resolvido] Duvida sobre trigger com update

Recommended Posts

eu tenho uma tabela  funcionário com uma coluna salário e criei uma nova coluna do tipo salário eu pensei em uma trigger

para que todas as vezes que um funcionário receba um aumento, nessa nova coluna seja registrada a quantia do último aumento recebido

mas quando executo o update da erro;

outra duvida dentro do update como o update sabe que é só deste  funcionario? o que colocar na clausula where dentro da trigger?

CREATE OR REPLACE TRIGGER new_salario_emp
BEFORE UPDATE
   ON emp
   FOR EACH ROW
   --
DECLARE
   salario number;
BEGIN
   salario  :=   :new.sal - :OLD.sal;
   --
   update emp set old_salario = salario;
   commit;
 --
END;

 

Share this post


Link to post
Share on other sites

O mais correto seria gravar uma outra tabela de log , tente ler sobre isto.

 

Todavia no seu exemplo bastaria atribuir o valor a coluna , mas repare que perderá a informação em uma segunda alteração.

 

BEGIN

  :new.old_salario := :OLD.sal;

 

End;

Share this post


Link to post
Share on other sites

Infelizmente eu não posso criar uma nova tabela,  a ideia foi justamente criar esta nova coluna para guardar o valor que foi dado como aumento.

Sim pode perder..pois a cada updade neste funcionario eu só vou guardar o ultimo valor.

Mas esta correto desta forma que eu fiz?

Pois não esta funcionando esta dando um erro de trigger mutante quando tento fazer um update.

 

Share this post


Link to post
Share on other sites
13 minutos atrás, Motta disse:

 

Outra dúvida como o update pega apenas o funcionario que esta sendo feito o update como colocar uma clausula where dentro da trigger sabendo o funcionario que esta atualizando o salario?

 

Share this post


Link to post
Share on other sites

OR EACH ROW a trigger será acionada para csda LINHA da tabela , no caso teu funcionário.

STATEMENT a trigger será acionada pelo declaração toda quantas linhas atinja.

 

Doc

 

https://www.devmedia.com.br/triggers-pl-sql-saiba-quando-e-por-que-usar/30011

 

https://www.devmedia.com.br/criacao-de-triggers-no-oracle/13039

Share this post


Link to post
Share on other sites

Eu vi que não se pode fazer um update na mesma tabela que esta sendo feito um update

pois gera este erro:

ora - 00060: conflito detectado ao aguardar recurso

Não tem nenhuma forma da trigger atualizar a coluna da minha tabela em que estou fazendo um update pois não é a mesma coluna

estou fazendo este update: update EMP set sal = 1000 where empno = 6799

e quando faço este update na coluna sal_novo a trigger tinha q atualizar pegando o valor novo - valor antigo e guardar e toda vez que eu fizer um update neste cara guardar o ultimo valor

Share this post


Link to post
Share on other sites
CREATE OR REPLACE TRIGGER new_salario_emp
BEFORE UPDATE--BEFORE POIS SERÁ ALTERADA UMA COLUNA
   ON emp
   FOR EACH ROW--PARA CADA LINHA
   --
DECLARE

BEGIN
   :NEW.old_salario := :OLD.sal;--ATRIBUI O VALOR ANTERIOR DE SAL A old_salario NAO PODE COMMITAR AQUI
 --
END;

 

Share this post


Link to post
Share on other sites

Motta se eu criar uma tabela_log como intermediaria ai inserir após o update e depois que inserir disparar uma outra trigger para atualizar a coluna com o valor do aumento ele da erro: ora-00060: conflito detectado ao aguardar recurso

E se eu coloco ao invés de :new :old_salario ele nao atualiza mas também nao da erro você sabe me dizer por que?

 

CREATE OR REPLACE TRIGGER new_salario_emp
AFTER INSERT
   ON emp_log
   FOR EACH ROW
   --
DECLARE
Pragma Autonomous_Transaction;
--
BEGIN
--
 update emp set old_salario = :new.sal - :new.old_salario where empno = :new.empno;
 commit;
--
END;

 

Share this post


Link to post
Share on other sites

não , seria algo como

 

CREATE OR REPLACE TRIGGER new_salario_emp
AFTER INSERT
   ON emp --a que dispara o log
   FOR EACH ROW
   --
DECLARE
Pragma Autonomous_Transaction;
--
BEGIN
--
 insert into emp__log (colunas) values);--edite este comando
 --commit; nunca commit em trigger !!!!!!!!!!!!!!!!!!!
--
END;

 

Share this post


Link to post
Share on other sites

A trigger para inserir na tabela log esta certo funcionando o problema é que preciso atualizar a coluna da tabela emp a minha ideia foi depois que inserir na tabela de log (codigo,salario,data,salario novo) eu ia disparar uma nova trigger before insert emp_log fazer o update na coluna da emp mas da erro

CREATE OR REPLACE TRIGGER new_salario_emp
AFTER INSERT
   ON emp_log
   FOR EACH ROW
     
DECLARE
Pragma Autonomous_Transaction;
BEGIN
update emp
set old_salario = :new.sal - :new.old_salario
where empno = :old.empno;
end;

 

Share this post


Link to post
Share on other sites

Meu post acima, basta atribuir direto a uma coluna

Share this post


Link to post
Share on other sites

Existe a coluna

old_salario 

?

manda o erro do Oracle

Share this post


Link to post
Share on other sites
Em 29/03/2019 at 10:44, Motta disse:

CREATE OR REPLACE TRIGGER new_salario_emp
BEFORE UPDATE--BEFORE POIS SERÁ ALTERADA UMA COLUNA
   ON emp
   FOR EACH ROW--PARA CADA LINHA
   --
DECLARE

BEGIN
   :NEW.old_salario := :OLD.sal;--ATRIBUI O VALOR ANTERIOR DE SAL A old_salario NAO PODE COMMITAR AQUI
 --
END;

 

Deu certo com esta ação, funcionou corretamente...obrigado

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By sadamkim
      Pessoal,  me deparei com um problema.
      Tenho uma Tabela, onde fica armazenada as transações dos clientes.
      Cada transação tem vários registros com o campo STATUS.
       
      Preciso fazer um MAX, para pegar a ultima transação por data, e assim saber qual foi o status da mesma.
      Mas ao utilizar o MAX e selecionar o campo STATUS ele me traz todos os registro, porque o mesmo não pode agrupar por status, por conter valores diferentes.
      É possível criar alguma forma de selecionar no meu caso a ultima transação por data (MAX) e trazer o campo status?
      Seja com alguma procedure, ou outra função do ORACLE.


    • By douglas.ribeiro.id
      Bom dia a todos
       
      a varios anos que nao tenho que criar um script no oracle nao consigo lembrar ne como começar e tambem estou sem o oracle instalado na maquina
      alguem poderia me ajudar? o problema e este: 
      Crie um segundo script (SCRIPT2.SQL) que possua um bloco de código para que gere registros fictícios para as tabelas criadas. Gere 1000 registros para a tabela EXAME_NF. Para cada EXAME_NF gere 3 registros. Faça com que a DATACADASTRO do EXAME_NF comece em 10 dias atrás, fazendo com que a cada 100 registros a data seja aumentada em 1 dia, distribuindo assim os 1000 registros em 10 dias diferentes de cadastro.
    • By pamf
      Prezados, boa noite!
       
      Me deparei com um problema aqui que acredito que seja bem simples para voces. Estou aqui precisando agrupar dados com a maior data de vendas para um cliente Numa coluna para todas as linhas do cliente (registro a registro das notas). Tambem preciso fazer algumas operacoes de total para disponibilizar um SCRIPT SQL sql para ser consumido por uma ferramenta analitica de BI e foi especificado exatamente como esta na planilha. Para facilitar criei os cenários. Tem os scripts de criacao da tabela e de insert e os resultados esperados nas colunas calculadas pelo sql. Espero que a documentação esteja boa para o caso de uso e que voces possam me ajudar. POde ser didatico para quem da aulas de PL SQL.
       
      Grato
       
      Att
      Paulo
       
      PS: como nao aceitou a planilha, escrevo abaixo:
       
      --SCRIPT DE CRIACAO TABELA ORACLE CREATE TABLE T_VENDAS (DATA_VENDA DATE, COD_CLI NUMBER (10), CLIENTE VARCHAR2(10), NUM_NF VARCHAR(10), ITEM VARCHAR2(20), QTDE NUMBER (10,2), VL_TOT_ITEM NUMBER (10,2), VL_UNIT NUMBER (10,2)); --INSERTS INSERT INTO T_VENDAS VALUES('05-Jan-2019',15,'JOAO','20','MESA',1,200,200); INSERT INTO T_VENDAS VALUES('05-Jan-2019',15,'JOAO','20','CADEIRA',4,240,60); INSERT INTO T_VENDAS VALUES('21-Jan-2019',15,'JOAO','66','BANCO',2,240,120); INSERT INTO T_VENDAS VALUES('08-Feb-2019',15,'JOAO','102','GELADEIRA',1,600,600); INSERT INTO T_VENDAS VALUES('07-Mar-2019',15,'JOAO','145','ARMARIO',1,450,450); INSERT INTO T_VENDAS VALUES('05-Jan-2019',20,'MARIA','28','SOFA',1,750,750); INSERT INTO T_VENDAS VALUES('05-Jan-2019',20,'MARIA','28','TAPETE',2,280,140); INSERT INTO T_VENDAS VALUES('21-Jan-2019',20,'MARIA','72','CORTINA',2,160,80); INSERT INTO T_VENDAS VALUES('08-Feb-2019',20,'MARIA','120','CAMA',1,400,400); INSERT INTO T_VENDAS VALUES('17-Feb-2019',20,'MARIA','151','COLCHAO',1,500,500);  
       
      CENARIOS (DADOS INSERIDOS NA TABELA T_VENDAS - COLUNAS DO EXCEL ABAIXO: B, C, D, E, F, G, H, I)
       

       
      COLUNAS CALCULADAS ESPERADAS NO SCRIPT SQL ALEM DAS COLUNAS JA EXISTENTES NA TABELA
       

       
      RESULTADO ESPERADO DO SCRIPT SQL
       

       
       
       
         
    • By EREGON
      Bom dia,
       
      tenho uma tabela cuja estrutura está toda em VARCHAR. Essa tabela contem algumas colunas com valores decimais, e quero executar algumas queries para fazer algumas operações aritméticas, como:
       
      -Devolver valores maiores que xx.xx, etc.
       
      Mas estou a ter erros, como:
       
      ORA-12801: erro assinalado no servidor de consulta paralela P009, instance ptlhb100.pt.sedc.internal.vodafone.com:CSTMRDM2 (2)
      ORA-01722: número inválido
      12801. 00000 -  "error signaled in parallel query server %s"
      *Cause:    A parallel query server reached an exception condition.
      *Action:   Check the following error message for the cause, and consult
                 your error manual for the appropriate action.
      *Comment:  This error can be turned off with event 10397, in which
                 case the server's actual error is signaled instead.
       
      Estou a executar a querie:
       
      SELECT TBL_NUMBER
      FROM MOBILE_UPSELL tl
      WHERE TO_NUMBER(tl.ARPU_MIB) < 8.01
       
      Já tentei TO_BINARY_NUMBER e dá o mesmo erro.
       
      O que está mal aqui?
       
      Obrigado
       
      Paulo
       
       
    • By luizfabianochaves
      bom dia..
       
      preciso fazer o calculo do prazo medio de recebimento da minha empresa, em relação ao periodo do ano passado.
      já tenho a soma de tudo o que recebi com 30, 60, 90, 120 e mais de 120 dias.. como calcular o prazo medio do pl sql com essas informações?
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.