Синтаксис при вызове процедуры двумя функциями - PullRequest
0 голосов
/ 18 октября 2018

Так что я пытаюсь добавить строку в таблицу "gymbesök", ничего сложного в этом нет.Но перед добавлением строки я должен вызвать две функции, которые я сделал.Но я не уверен, как создается синтаксис при вызове два.Если две функции не соответствуют требованиям REQ, транзакция прекращается.

Вот мой код

Create or replace procedure do_gymbesök(
P_rfid in gymbesök.rfid%type,
P_gymid in number)
As
Begin
Insert into gymbesök (radnr,rfid,gymid,datum)
Values (radnr_seq.nextval, p_rfid, p_gymid, sysdate);
if (get_behörighet (p_gymid, p_rfid) = 0) then
raise_application_error (-20001, 'Öbehörig');
or
 if  (get_träningspass(p_antal) = 0) then
raise_application_error (-20001, 'Inga träningspass kvar');

end if;
end;
/

Спасибо

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Что-то вроде этого, возможно?

  • Если первая функция не сработает, она повысит 20000.
  • В противном случае проверьте, что возвращает вторая;если это не удастся, поднимите 20001.
  • Если ни один из них не сработает, выполните INSERT

. Я изменил коды ошибок, которые вы вернули, чтобы вы могли различить эти два.Использовать 20001 для обоих случаев не является ошибкой, но - зачем вам это?


create or replace procedure do_gymbesök(
  p_rfid in gymbesök.rfid%type,
  p_gymid in number)
as
begin
  if get_behörighet (p_gymid, p_rfid) = 0 then
     raise_application_error (-20000, 'Öbehörig');
  elsif get_träningspass(p_antal) = 0 then
     raise_application_error (-20001, 'Inga träningspass kvar');
  end if;

  insert into gymbesök (radnr,rfid,gymid,datum)
  values (radnr_seq.nextval, p_rfid, p_gymid, sysdate);
end;
/

В качестве альтернативы используйте одно условие IF с OR:

create or replace procedure do_gymbesök(
  p_rfid in gymbesök.rfid%type,
  p_gymid in number)
as
begin
  if get_behörighet (p_gymid, p_rfid) = 0 or
     get_träningspass(p_antal) = 0
  then
     raise_application_error (-20001, 'Öbehörig / Inga träningspass kvar');
  else  
     insert into gymbesök (radnr,rfid,gymid,datum)
     values (radnr_seq.nextval, p_rfid, p_gymid, sysdate);
  end if;
end;
/
0 голосов
/ 18 октября 2018

Выполните проверку как два отдельных вызова.Кроме того, было бы лучше сначала проверить параметры и вставить строку только в том случае, если проверка прошла успешно.

Create or replace procedure do_gymbesök(
P_rfid in gymbesök.rfid%type,
P_gymid in number)
As
Begin
 if  (get_träningspass(p_antal) = 0) then
      raise_application_error (-20001, 'Inga träningspass kvar');
  end if;
  if (get_behörighet (p_gymid, p_rfid) = 0) then
      raise_application_error (-20001, 'Öbehörig');
   end if;
  Insert into gymbesök (radnr,rfid,gymid,datum)
  Values (radnr.seq.nextval, p_rfid, p_gymid, sysdate);


end;
/

Оба ваших вызова RAISE_APPLICATION_ERROR используют один и тот же номер ошибки.Вообще говоря, для разных ошибок полезно использовать разные номера ошибок, а не просто разные сообщения.Oracle предоставляет щедрые тысячи чисел в диапазоне от -20999 до -20000, поэтому их должно быть достаточно для обхода.


У вас есть тест для p_antal, которого нет в опубликованном коде.Я предполагаю, что это ошибка транскрипции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...