我正在尝试验证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
上面的功能尚未完善,但现在可以使用。
答案 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_found
或too_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
表 - 它没有添加任何值。