Sql 触发器中的调用函数
所以我有一个返回saldo的函数。看起来是这样的:Sql 触发器中的调用函数,sql,oracle,Sql,Oracle,所以我有一个返回saldo的函数。看起来是这样的: create or replace function get_saldo( p_knr in konto.knr%type) return number as v_saldo konto.saldo%type; begin select saldo into v_saldo from konto where knr = p_knr; return v_saldo; exception when no_data_found then return
create or replace function get_saldo(
p_knr in konto.knr%type)
return number
as
v_saldo konto.saldo%type;
begin
select saldo
into v_saldo
from konto
where knr = p_knr;
return v_saldo;
exception
when no_data_found then
return -1;
end;
我的触发器应该调用get_saldo并检查插入取款表的金额是否不超过帐户上的金额。到目前为止,我的触发器是这样的:
create or replace trigger bifer_överföring
before update or insert
of belopp
on insättning
for each row
begin
if (:new.belopp < get_saldo(p_knr)) then
raise_application_error(-20001,'Överföringssumman är högre
än vad som finns på kontot');
end if;
end;
创建或替换触发器biferöverföring
在更新或插入之前
贝洛普的
论insättning
每行
开始
如果(:new.belopp
希望你们能理解我的意思。这是一项学校任务,我们需要使用存储过程。我对存储过程非常陌生,我似乎真的不懂它的窍门。在我看来还行,除了以下几点:
if (:new.belopp < get_saldo(p_knr)) then
-----
如果(:new.belopp
你应该把一些东西传递给函数;它不能是
p_knr
,而是类似于:new.knr
(或者insättning
表中存在的可用于计算saldo的列)。问题是什么。触发器中不存在名为p_knr
的变量。2.如果您想在金额高于saldo的情况下引发错误,则需要:new.belopp>get_saldo
,而不是:new.belopp
。3.如果帐户不存在,则返回-1的saldo。-1不是有效的萨尔多吗?我认为引发异常或至少返回null将是更好的反应。4.如果使用缩进,代码的可读性会更高。