Oracle apex 验证以检测数字字段中的文本

Oracle apex 验证以检测数字字段中的文本,oracle-apex,Oracle Apex,我正在努力防止用户破坏创建新产品页面。在创建页面上,我有一个文本字段:product\u name和一个数字字段:product\u quantity 当前,当他们在product_quantity(产品数量)字段中输入文本并单击“保存”时,会出现以下错误: 处理验证时出错 ORA-01722:无效号码 我已经调查了这个错误,但是我认为在Apex中,如果您选择了一个数字字段,它将检测用户输入的是文本还是数字字符 如果用户输入了文本,是否有显示验证消息的方法?如果用户输入了文本,验证消息将发出呼喊

我正在努力防止用户破坏创建新产品页面。在创建页面上,我有一个文本字段:product\u name和一个数字字段:product\u quantity

当前,当他们在product_quantity(产品数量)字段中输入文本并单击“保存”时,会出现以下错误:

处理验证时出错

ORA-01722:无效号码

我已经调查了这个错误,但是我认为在Apex中,如果您选择了一个数字字段,它将检测用户输入的是文本还是数字字符

如果用户输入了文本,是否有显示验证消息的方法?如果用户输入了文本,验证消息将发出呼喊,否则,验证消息将允许用户保存新的输入

更新

我知道它为什么会发生,但不知道如何解决它

我重新创建了我的页面,它成功了。然后,我在我的页面处理中添加了两个验证,当我尝试时,我在最初的帖子中得到了错误。如果我禁用它们,它会再次工作。在添加输入值之前,验证用途不存在,用于查找输入值是否已存在于表中

如果在查看是否输入了数值后才开始验证。我停止了查看相关项目的验证,并关闭了“按下时”按钮,但仍然没有任何乐趣

select 1 from MY_TABLE where column_name = :P6_TEXT_FIELD

在我在页面处理中创建验证之前,是否有办法运行文本框验证(检查是否输入了文本)?

验证就是这样:它们都会执行,不会短路。在调试页面时,您实际上可以清楚地看到这种情况发生。
对于数字字段,您会看到它没有通过数字验证。但这并没有停止验证。因此,您的第二次验证将使用提交的值运行,但当您输入文本时,显然会失败


有一些解决办法。 例如,您可以将不存在的验证更改为返回错误消息的PLSQL函数,并执行如下操作(示例):


但是-在这种情况下,如果您希望检查重复条目,那么如果您至少在版本4.1上,则可能存在更好的选项。如果您的表定义了正确的约束,那么您将在执行not exists操作的字段上定义一个唯一的键。这意味着如果您不在字段上进行此验证,您将得到ora-00001
DUP\u VAL\u on_INDEX
错误。
然后,您可以使用apex提供的错误处理来捕获此错误,并生成一条用户友好的消息。
您可以在apex开发团队的Patrick Wolf的博客上找到如何使用和实现此功能的示例:


我想知道您是否意外删除了验证。您能否尝试重新创建页面并查看问题是否仍然存在?该字段是定义为文本字段还是数字字段?数字是用
?@Tom输入的吗?这是一个文本字段,但我后来对自己说,数据库列是数字的,输入的值是数字的,所以从技术上讲,字段应该是数字字段。数值验证在另一个页面上的字段上工作得非常好。这就是为什么我对这个有点迷茫。明天我会试试马修的建议。@Tom我发现了问题的原因(见更新的帖子),我想知道你是否知道解决问题的方法?thanks@MatthewMoisen我尝试了你的建议,发现了问题的原因,但不太确定如何解决。
DECLARE
  v_test_nbr NUMBER;
  v_check_exists NUMBER;
BEGIN
  BEGIN
    v_test_nbr := to_number(:P6_TEXT_FIELD);
  EXCEPTION
  WHEN OTHERS THEN
    -- or catch 1722 (invalid number) and 6502 (char to number conversion error)
    v_test_nbr := NULL;
  END;

  IF v_test_nbr IS NOT NULL
  THEN
  -- if v_test_nbr is not null then the field should be numerically valid
  -- if it isn't then this code would be skipped and this validation
  -- will not throw an error.
  -- However, the previous validation will still fail when text is entered, 
  -- so this shouldn't matter.
    BEGIN
      SELECT 1
      INTO v_check_exists
      FROM my_table
      WHERE column_name = :P6_TEXT_FIELD;
    EXCEPTION 
    WHEN no_data_found THEN
      v_check_exists := 0;
    END;

    IF v_check_exists = 1 
    THEN
      RETURN 'A record with this key already exists';      
    END IF;
  END IF;

  RETURN NULL;
END;