在pl / sql中的触发器内调用函数

时间:2012-02-21 11:05:26

标签: sql oracle

我在互联网上搜索了一些资源,为我提供了一个如何调用我在PL / SQL中的触发器中创建的函数的示例。

我创建了一个名为get_balance的函数,如下所示:

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;
/

现在我想在触发器中调用此函数以在撤回之前检查余额。我试着这样做,但我认为这是完全错误的:

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;
/

有人可以请一位新手提供一个如何从触发器中调用函数的示例吗?

1 个答案:

答案 0 :(得分:3)

您需要指定p_custno我使用默认NEW别名的值,但请参阅here了解触发器信息,RenéNyffenegger的good explanation { {1}}和NEW用法:

OLD

您还需要指定create or replace trigger bifer_withdrawal before insert on withdrawal for each row begin if get_balance(:NEW.custno) <= amount then raise_application_error(-20001, 'Not enough money in account!'); end if; end; / 。如果它是变量,则在AMOUNTFOR EACH ROW语句之间声明它:

e.g:

BEGIN

您应该问问自己,是否需要调用该功能?
您可以轻松地将光标包裹在触发器中并保存功能调用。
你的答案将取决于你是否想在其他地方重复使用这个功能等问题。
我不是主张一种方式而是另一种方式,但需要考虑。

希望它有所帮助...

编辑:在以下两条评论之后,如果create or replace trigger bifer_withdrawal before insert on withdrawal for each row declare c_amount CONSTANT account.balance%TYPE := 5000; -- Whatever limit you need begin if get_balance(:NEW.custno) <= c_amount then raise_application_error(-20001, 'Not enough money in account!'); end if; end; / 是表AMOUNT中的一列,那么:

WITHDRAWAL