- Este tópico contém 1 resposta, 2 vozes e foi atualizado pela última vez 5 anos, 8 meses atrás por José Laurindo Chiappa.
-
AutorPosts
-
28 de março de 2019 às 7:35 pm #139607Claudio ReisParticipante
Boa noite pessoal,
Sou iniciante e gostaria de uma ajuda numa questão
tenho uma coluna salario e criei uma nova coluna old_salario na tabela emp
quero quando der um aumento para certo funcionario o salario antigo va para este campo old_salario.
eu criei esta trigger mas esta dando erro, outra duvida como eu coloco na clausula para ele saber que é tudo do mesmo funcionario?
tenho o seguinte codigo:CREATE OR REPLACE TRIGGER old_salario_emp
BEFORE UPDATE
ON emp
FOR EACH ROW
WHEN (NEW.SAL > 0)
—
DECLARE
salario number;
BEGIN
salario := :OLD.sal;
update emp set old_salario = salario;
END;29 de março de 2019 às 8:32 am #139719José Laurindo ChiappaModeradorBlz ? Então, o conceito que te falta é o seguinte : quando vc declara uma trigger como FOR EACH ROW, se ela for do tipo BEFORE o que ocorrer ** automagicamente ** para CADA registro/linha da tabela que for afetado pelo INSERT ou UPDATE ou DELETE os valores TODOS que vão ser aplicados no registro vão pra uma variável do tipo RECORD na memória chamada NEW e os valores que estão atualmente no registro vão pra uma variável chamada OLD… O pulo do gato é que essa variável NEW é ALTERÁVEL, e se vc a alterar , é ESSE VALOR ALTERADO que vai pra tabela….
Sendo assim, teu trigger vai ficar (supondo que na tabela emp vc tem uma coluna SAL que é o salário a alterar e uma outra coluna OLD_SALARIO que vc quer botar o valor que estava ANTES do DML, e Aproveitando pra especificar que a trigger só dispara se o UPDATE estiver ocorrendo na coluna SAL) :CREATE OR REPLACE TRIGGER old_salario_emp BEFORE UPDATE OF sal ON emp FOR EACH ROW WHEN (NEW.SAL > 0) BEGIN :NEW.old_salario := :OLD.sal; END;
=> PRONTO !! Como a trigger é BEFORE e FOR EACH ROW , como eu disse AUTOMAGICAMENTE os valores das colunas da tabela VÂO ir pra uma variável NEW, E se vc alterar o conteúdo dela esse valor alterado VAI ser usado… NÃO FAZ SENTIDO (e nem é permitido, sob pena de erro MUTATING TRIGGER) vc querer fazer INSERT, UPDATE ou DELETE na tabela à qual a trigger está amarrada…
Exemplo :scott@DESENV:SQL>desc emp Name Null? Type <hr /> EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2) scott@DESENV:SQL>alter table EMP add OLD_SALARIO number(7,2); Tabela alterada. scott@DESENV:SQL>CREATE OR REPLACE TRIGGER old_salario_emp BEFORE UPDATE OF sal ON emp FOR EACH ROW 2 WHEN (NEW.SAL > 0) 3 BEGIN 4 :NEW.old_salario := :OLD.sal; 5 END; 6 / Gatilho criado. scott@DESENV:SQL>select deptno, empno, ename, sal, old_salario from emp order by 1,4; DEPTNO EMPNO ENAME SAL OLD_SALARIO <hr />
10 7934 MILLER 1300
10 7782 CLARK 2450
10 7839 KING 5000
20 7369 SMITH 800
20 7876 ADAMS 1100
20 7566 JONES 2975
20 7788 SCOTT 3000
20 7902 FORD 3000
30 7900 JAMES 950
30 7654 MARTIN 1250
30 7521 WARD 1250
30 7844 TURNER 1500
30 7499 ALLEN 1600
30 7698 BLAKE 285014 linhas selecionadas. scott@DESENV:SQL>update emp set SAL = SAL + 10 where sal = 1250; 2 linhas atualizadas. scott@DESENV:SQL>select deptno, empno, ename, sal, old_salario from emp order by 1,4; DEPTNO EMPNO ENAME SAL OLD_SALARIO <hr />
10 7934 MILLER 1300
10 7782 CLARK 2450
10 7839 KING 5000
20 7369 SMITH 800
20 7876 ADAMS 1100
20 7566 JONES 2975
20 7788 SCOTT 3000
20 7902 FORD 3000
30 7900 JAMES 950
30 7654 MARTIN 1260 1250
30 7521 WARD 1260 1250
30 7844 TURNER 1500
30 7499 ALLEN 1600
30 7698 BLAKE 285014 linhas selecionadas.
===> Não tem segredo, blz ??
[]s
Chiappa
-
AutorPosts
- Você deve fazer login para responder a este tópico.