2012-02-21 6 views
0

PL/SQLのトリガー内で作成した関数を呼び出す方法の例をインターネットで検索しました。pl/sqlのトリガー内の関数を呼び出す

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

は今、私は撤退する前に残高を確認するために、トリガー内からこの関数を呼び出したい:

私はこのようになりますget_balanceという関数を作りました。次のように私はそれを実行しようとしましたが、私はそれは完全に間違ってだと思う:

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

:以下の2つのコメントの後、AMOUNT場合WITHDRAWALその後、テーブルの列です:

EDITが...それがお役に立てば幸いですあなたはこれをコンパイルしている間に得た? –

+0

アンビエントトランザクション? –

+0

コンパイルされますが、警告が表示されます。 – Posidon

答えて

2

あなたはまた、ルネNyffeneggerのは、NEWOLD利用good explanation持って、私はデフォルトNEW別名を使用していたp_custnoの値を指定しますが、トリガ情報についてhereを確認する必要があります:あなたがする必要があります

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 ROWBEGIN文の間にそれを宣言します。

例えば:

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

をあなたは自問し、関数を呼び出す必要がありますでしょうか?
トリガーにカーソルを簡単にラップし、自分自身で関数呼び出しを保存することができます。
あなたの答えは、他の場所で関数を再利用するかどうかの問題に依存します。
私は他の方法よりも1つの方法を推奨していませんが、考慮する必要があります。あなたは正しいだけ....任意のエラーをしている

create or replace 
trigger bifer_withdrawal 
before insert on withdrawal 
for each row 
begin 
    if get_balance(:NEW.custno) <= :NEW.amount 
    then 
     raise_application_error(-20001, 'Not enough money in account!'); 
    end if; 
end; 
/
+0

私は彼が与えたいと思う:5000の代わりにNEW.amount(あなたの2番目のクエリ).. –

+0

あなたの助けてくれてありがとう!私はより正確に私の問題を説明していたはずです。「金額」はテーブル引き出しの列です。 – Posidon

+0

回答が上記のコメントのため編集されました... – Ollie

関連する問題