Oracle顶点项验证(函数返回布尔值)ORA-01403
我正在尝试验证APEX中的字段 它应该做什么: 检查申请人年龄是否在18岁以下,如果为18岁,则需要法定代表人。 这将由BSN人员进行检查 字段: P68_REKENINGHOUDER包含申请人的BSN。 P68_WETV1包含法定代表人的BSN 功能: GetLeeftijd:获取人员的年龄、测试和工作情况Oracle顶点项验证(函数返回布尔值)ORA-01403,oracle,validation,oracle-apex,kill,Oracle,Validation,Oracle Apex,Kill,我正在尝试验证APEX中的字段 它应该做什么: 检查申请人年龄是否在18岁以下,如果为18岁,则需要法定代表人。 这将由BSN人员进行检查 字段: P68_REKENINGHOUDER包含申请人的BSN。 P68_WETV1包含法定代表人的BSN 功能: GetLeeftijd:获取人员的年龄、测试和工作情况 create or replace Function GetLeeftijd(bsn_nummer number) RETURN NUMBER AS v_leeftijd NUMBER :
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;
项验证类型:创建时返回布尔值的函数
其他资料:
运行应用程序Express 4.0.0.00.46
上面的函数还没有完善,但现在可以使用。这两个字段中的任何一个是否可能为NULL,或者是否有一个值没有出现在PERSONEN表中?我猜P68_WETV1至少是可选的 如果调用GetLeeftijd并传入空值,此查询将不返回任何行
SELECT months_between(SYSDATE, CAST("PERSONEN"."GEBOORTEDATUM" AS DATE)) /12
INTO v_leeftijd
FROM dual, "PERSONEN"
WHERE "PERSONEN"."BSN" = bsn_nummer;
返回除1行以外的任何内容的SELECT INTO语句是一个异常,要么找不到数据,要么行太多。您可能希望捕获函数中的异常,或者在验证中调用函数之前检查字段是否有数据。比如说
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;
请注意,我从查询中删除了双表的笛卡尔连接-它没有添加任何值。同意,脚本需要一些改进。但是,如果我使用非空值测试此验证,它将失败,并出现相同的错误。例如,如果我为REKENINGHOUDER输入569852011和658215409,这两者都存在于数据库中,单击submit仍将导致错误。当我在Oracle SQL Developer中使用这些测试值时,它将毫无问题地运行。提交页面后,这些项目的会话状态是什么?您是否尝试过使用调试和双重检查来运行页面?项目的源设置是什么,例如始终,db列?
SELECT months_between(SYSDATE, CAST("PERSONEN"."GEBOORTEDATUM" AS DATE)) /12
INTO v_leeftijd
FROM dual, "PERSONEN"
WHERE "PERSONEN"."BSN" = bsn_nummer;
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;