[Resolvido] Trigger Oracle

2 respostas
E

Nos meus esquemas de relação abaixo:

FUNCIONARIO(CPF, PNOME, SNOME, CPF_GERENTE, DEPARTAMENTO, SALARIO)
DEPARTAMENTO(NOME_DEPARTAMENTO, NUMERO_FUNCIONARIOS)
HISTORICO(CPF, DATA_CONTRATACAO, DATA_DESLIGAMENTO, ULTIMA_MODIFICACAO)
GERENTE(CPF_GERENTE, NOME_DEPARTAMENTO, SALARIO)

Eu quero criar uma trigger que seja disparada na inserção de um novo funcionario. Caso o salário em FUNCIONARIO seja maior que o salário de seu respectivo gerente, a inserção seja negada. A ligação entre as tabelas FUCIONARIO e GERENTE é CPF_GERENTE.

create or replace trigger tri_fun_insert before insert on FUNCIONARIO begin if :new.salario >= ... end;

Como posso fazer? Eu NÃO posso colocar em “…” um select do tipo “select salario from gerente where cpf_gerente = :new.cpf_gerente”, pois gera erro.

2 Respostas

A

Sempre que você dá um select dentro de um bloco PL-SQL, precisa atribuir o retorno a uma variável usando INTO, ou percorre-lo com um cursor. Para o primeiro caso seria algo do tipo:

select salario
into V_SALARIO
from blablabla

Daí pra frente, você pode fazer sua validação:

if :new.salario > V_SALARIO then
  ... o tratamento que você vai dar
end if;

Então, dentro desse if, você pode dar um rollback. Pesquise também sobre RAISE EXCEPTION e RAISE_APPLICATION_ERROR que poderão fazer coisas interessantes pra você.

E

ADEMILTON:
Sempre que você dá um select dentro de um bloco PL-SQL, precisa atribuir o retorno a uma variável usando INTO, ou percorre-lo com um cursor. Para o primeiro caso seria algo do tipo:

select salario
into V_SALARIO
from blablabla

Daí pra frente, você pode fazer sua validação:

if :new.salario > V_SALARIO then
  ... o tratamento que você vai dar
end if;

Então, dentro desse if, você pode dar um rollback. Pesquise também sobre RAISE EXCEPTION e RAISE_APPLICATION_ERROR que poderão fazer coisas interessantes pra você.

Muito obrigado, ADEMILTON!

Consegui fazer o que queria!!

Abraço.

Criado 3 de dezembro de 2012
Ultima resposta 3 de dez. de 2012
Respostas 2
Participantes 2