Gostaria de saber se para raise la dentro do if teria alguma outra solução..
Quero impedir que o insert seja feito porem não quero exception gerada.. como fazer isso
Create or Replace Trigger TR_IN_ITEM
Before Insert
on ITEM
For Each Row
Declare LTOTALITENS INTEGER;
LNOTA INTEGER;
Begin
-- Seleciona o código da nota que está sendo incluída.
LNOTA := :New.IDNOTA;
-- Totaliza a quantidade de itens já cadastrados na nota.
Select COUNT(*)
Into LTOTALITENS
From ITEM
Where IDNOTA = LNOTA;
-- Verifica se existem mais do que 30 itens na nota.
If (LTOTALITENS > 30) Then
Raise_Application_Error(-20000,'A nota ' || :New.IDNOTA || ' já
está cheia. Inclusão cancelada.');
End If;
End;
Gerar a exceção seria a solução ideal neste caso, tratando a exceção nas aplicações, escolhendo ignorar ou não o erro retornado.
Uma outra possibilidade seria criar uma view, e sobre ela criar uma trigger instead of insert, alterando as todas as referências à tabela para a view na sua aplicação...
Mas pela pergunta, acredito que no seu caso não seja possível alterar a aplicação.. neste caso, você poderia renomear a sua tabela, criar a view com o nome antigo da tabela, e criar as views instead of insert, update e delete, refletindo as devidas operações na tabela original.
Ué.. não entendi muito bem agora..
Mesmo usando a cláusula WHEN na trigger, o insert ainda será realizado, a única diferença é que a trigger não será executada neste caso.. era isso mesmo o esperado?
Pelo que havia entendido o insert não deveria ser realizado..
e porque tem um porem..
eu ouvi por alta o problema real aqui e na verdade e um pouco mais simples
so tem um caso que não pode haver o raise então um desvio resolve..
mas você tem razao..
realmente o que eu pensei que iria precisar era impedir o insert.. e o when não resolve.. so a instead of mesmo