Вызов функции внутри триггера в pl / sql - PullRequest
0 голосов
/ 21 февраля 2012

Я искал в Интернете какой-то ресурс, предоставляющий мне пример вызова функции, которую я создал из триггера в 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 Ответ

3 голосов
/ 21 февраля 2012

Вам необходимо указать значение для p_custno Я использовал псевдоним NEW по умолчанию, но см. здесь для информации о триггере, также у Рене Найффенггера есть хорошее объяснение из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 и 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 затем:

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; 
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...