我在互联网上搜索了一些资源,为我提供了一个如何调用我在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;
/
有人可以请一位新手提供一个如何从触发器中调用函数的示例吗?
答案 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;
/
。如果它是变量,则在AMOUNT
和FOR 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