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

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 :

我正在尝试验证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 := 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;