过程调用两个函数时的语法

时间:2018-10-18 15:17:12

标签: oracle plsql

所以我试图在表“gymbesök”中添加一行,对此没有什么复杂的。但是在添加一行之前,我应该调用ive制作的两个函数。但是我不确定在调用两个时如何建立语法。如果这两个功能不符合REQ,则交易将停止。

这是我的代码

dsquery * "Fully-Qualified-DN-Here" -scope base -attr badPwdCount -s DomainControllerUsedInLDAPBind

谢谢

2 个答案:

答案 0 :(得分:2)

将验证作为两个单独的调用进行。另外,最好先验证参数,并且仅在验证通过后才插入行。

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的测试,该测试未出现在发布的代码中。我认为这是一个转录错误。

答案 1 :(得分:2)

也许是这样?

  • 如果第一个函数失败,它将提高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;
/