Appeler une fonction au sein d'un déclencheur en pl/sql
J'ai cherché par le biais de l'Internet pour des ressources de me fournir un exemple de comment appeler une fonction que j'ai créée à partir d'un déclencheur en PL/SQL.
J'ai fait une fonction appelée get_balance
qui ressemble à ceci:
create or replace function get_balance(p_custno in number)
return number
as
v_balance account.balance%type;
begin
select balance
into v_balance
from account
where custno = p_custno;
return v_balance;
end;
/
Maintenant, je veux appeler cette fonction dans un déclencheur pour vérifier le solde avant un retrait. J'ai essayé de faire comme suit, mais je pense que c'est totalement faux:
create or replace trigger bifer_withdrawal
before insert on withdrawal
for each row
begin
if get_balance(p_custno) <= amount then
raise_application_error(-20001, 'Not enough money in account!');
end if;
end;
/
Quelqu'un pourrait-veuillez fournir un débutant avec un exemple de comment appeler une fonction dans un trigger?
- vous faites corriger .... toute erreur que vous avez obtenu tout le compiler?
- ambiante transaction?
- Il compile mais j'obtiens un message d'avertissement.
- Et la raison pourquoi vous ne nous dites pas ce que l'avertissement est?
- Désolé Ollie, je suis nouveau sur SQL-developer et ne savez pas où chercher de l'avertissement. Je vous serais reconnaissant si vous pouviez me dire où chercher. À la sortie du script de vue il est dit que le déclencheur est compilé avec des avertissements.
- Je pense que dans SQL Developer, vous pouvez utiliser Affichage -> le Journal dans le menu principal si je n'ai pas SQL Developer installé sur le PC que j'utilise aujourd'hui.
Vous devez vous connecter pour publier un commentaire.
Vous devez spécifier la valeur de
p_custno
j'ai utilisé le défautNEW
alias mais voir ici pour déclencher d'informations, aussi René Nyffenegger a une bonne explication de laNEW
etOLD
utilisation:Vous devrez préciser quelles
AMOUNT
est trop. Si c'est une variable, puis déclarer entre lesFOR EACH ROW
etBEGIN
états:par exemple:
Vous devriez demander vous-même, vous devez appeler la fonction?
Vous pouvez facilement enrouler le curseur sur la gâchette et vous épargner l'appel de la fonction.
De votre réponse dépendra des questions autour de vous si vous souhaitez la réutiliser ailleurs etc.
Je ne dis pas d'une façon plus que l'autre, mais c'est quelque chose à considérer.
Espère que ça aide...
EDIT: Après les deux commentaires ci-dessous, si
AMOUNT
est une colonne dans la tableWITHDRAWAL
alors:amount
est une colonne dans la table de retrait.