Oracle APEX项验证(函数返回布尔值)ORA-01403

时间:2014-01-24 21:54:54

标签: oracle validation oracle-apex kill

我正在尝试验证APEX中的字段。

它应该做什么:
检查申请人是否未成年人(年龄<18岁),如果是,则需要法定代表人 这将与BSN人员核实。

字段:
P68_REKENINGHOUDER(包含申请人的BSN)。
P68_WETV1(包含法定代表人的BSN)。

功能:
GetLeeftijd :(获取人的年龄,测试和工作)

create or replace Function GetLeeftijd(bsn_nummer number)
RETURN NUMBER
AS
v_leeftijd NUMBER := 18;

BEGIN
  SELECT months_between(SYSDATE, CAST("PERSONEN"."GEBOORTEDATUM" AS DATE)) /12 INTO v_leeftijd
  FROM dual, "PERSONEN"
  WHERE "PERSONEN"."BSN" = bsn_nummer;

RETURN v_leeftijd;

END;

项目验证(类型:函数返回布尔值ON创建)

declare

v_rekh number;
v_wetv number;

begin
v_rekh := GetLeeftijd(:P68_REKENINGHOUDER);
v_wetv := GetLeeftijd(:P68_WETV1);

  if v_rekh < 18 then
    if :P68_WETV1 is NULL then
      return false;
    else
      if v_wetv < 18 then
        return false;
      else
        return true;
      end if;
    end if;
  else
    return true;
  end if;
end;

实际发生的事情:
找不到数据错误。

ORA-01403: Geen gegevens gevonden.
Error   ERR-1021 Unable to run "function body returning boolean" validation. 

其他信息:
运行Application Express 4.0.0.00.46
上面的功能尚未完善,但现在可以使用。

1 个答案:

答案 0 :(得分:1)

两个字段中的任何一个字段都可能是NULL还是具有PERSONEN表中没有出现的值?我猜这个P68_WETV1至少是可选的。

如果您致电GetLeeftijd并传入NULL值,此查询将不会返回任何行

SELECT months_between(SYSDATE, CAST("PERSONEN"."GEBOORTEDATUM" AS DATE)) /12 
  INTO v_leeftijd
  FROM dual, "PERSONEN"
  WHERE "PERSONEN"."BSN" = bsn_nummer;

返回1行以外的任何内容的SELECT INTO语句是一个例外(no_data_foundtoo_many_rows)。您可能希望在函数中捕获异常,或者在验证中调用函数之前检查字段是否包含数据。所以,例如

create or replace Function GetLeeftijd(bsn_nummer number)
RETURN NUMBER
AS
v_leeftijd NUMBER := 18;

BEGIN
  BEGIN
    SELECT months_between(SYSDATE, CAST(PERSONEN.GEBOORTEDATUM AS DATE)) /12 
      INTO v_leeftijd
      FROM PERSONEN
     WHERE PERSONEN.BSN = bsn_nummer;
  EXCEPTION
    WHEN no_data_found
    THEN
      v_leeftijd := 0;
  END;

  RETURN v_leeftijd;  
END;

请注意,我从您的查询中删除了笛卡尔联接到dual表 - 它没有添加任何值。