Oracle Apex 20.1 错误:处理验证时出错

Posted

技术标签:

【中文标题】Oracle Apex 20.1 错误:处理验证时出错【英文标题】:Oracle Apex 20.1 Error: Error processing validation 【发布时间】:2020-07-31 06:23:26 【问题描述】:

我正在尝试为 oracle apex 上的应用程序中的页面创建验证。下面是我拥有的 pl/sql 函数体(返回布尔值):

declare v_equipid integer;
begin
        SELECT count(*) into v_equipid from equipment
        WHERE equipstatus = 'available' and equipID = :P3_EquipID;

    if v_equipid = 1 then
        return true;
    else
        return false;
    end if;
end; 

用于检查提交的EquipID是否有equipstatus = 'available'。在我运行应用程序并提交表单后,它给出了以下错误:

错误:处理验证时出错。

is_internal_error: true is_common_runtime_error: false apex_error_code:APEX.VALIDATION.UNHANDLED_ERROR ora_sqlcode:-6502 ora_sqlerrm: ORA-06502: PL/SQL: 数值或数值错误 ORA-06512:在“APEX_200100.WWV_FLOW_VALIDATION”,第 846 行 ORA-06512:在“APEX_200100.WWV_FLOW_VALIDATION”,第 846 行 error_backtrace:ORA-06512:在“APEX_200100.WWV_FLOW_VALIDATION”,第 846 行 ORA-06512:在“APEX_200100.WWV_FLOW_VALIDATION”,第 846 行 ORA-06512:在“APEX_200100.WWV_FLOW_VALIDATION”,第 1029 行

我不知道如何解决此问题,希望您能提供帮助。提前谢谢!

【问题讨论】:

【参考方案1】:

数值或数值错误,嗯?

这可能是导致问题的原因:

and equipID = :P3_EquipID;

equipID 的数据类型是什么?如果是NUMBER,试试

and equipID = to_number(:P3_EquipID);

因为情况并非如此(正如您评论的那样),这有帮助吗?

declare 
  v_equipid number;
begin
  SELECT count(*) 
    into v_equipid 
    from equipment
    WHERE equipstatus = 'available' 
      and equipID = :P3_EquipID;

  return v_equipid = 1;
end; 

【讨论】:

EquipID 是一个数字,但这似乎不是问题,因为添加 to_number 并不能解决问题。不过谢谢! 我明白了。我猜equipstatus 一个字符串,对吧?我还添加了一些代码;看看有没有帮助。 equipstatus 是 Varchar2,oracle 不允许 return v_equipid,我收到此错误:ORA-06550: PLS-00382: 表达式类型错误。 我没说要重新调整。再看一遍。 对不起,我刚试过return v_equipid = 1,还是数值或数值错误【参考方案2】:

在 apex 中开发的关键是调试自己的代码。这需要一点时间来适应。研究如何调试您的 apex 应用程序和检测您的 pl/sql 代码,网上有大量可用的文档。

您可以通过在 SQL 研讨会中运行该 pl/sql 来调试验证。将您的 RETURN TRUE/FALSE 语句替换为 dbms_output.put_line('true/false') 以获得结果。在 sql Workshop 中运行它会给你确切的行号。 ORA-06502 通常意味着为 NUMBER 类型的变量或列分配了数据类型 VARCHAR2 的值(或其他不能转换回数字的数据类型)。

确保在将代码移回 apex 时再次删除 dbms_output 语句。

您还可以使用 apex_debug 在 apex 本身中调试您的进程,查看 documentation 以了解功能的完整概述,如下所示:

DECLARE
  v_equipid NUMBER; --integer is deprecated, should not be used
BEGIN
  -- put double quotes around the %0 to make any trailing/leading characters visible.
  apex_debug.info(
      p_message => 'Start of validation,  P3_EQUIPID = "%0"',
      p0        => :P3_EQUIPID);
  SELECT COUNT(*)
    INTO v_equipid
    FROM equipment
   WHERE equipstatus = 'available' AND
         equipid = :P3_EQUIPID;
  apex_debug.info(
      p_message => 'After SELECT INTO,  v_equipid = "%0"',
      p0        => v_equipid);
  IF v_equipid = 1 THEN
    RETURN true;
  ELSE
    RETURN false;
  END IF;
END;

在开发人员工具栏中启用调试并调查您的页面的调试。您放入其中的消息应该在调试日志中可用。抛出错误后您在代码中输入的消息将不可见,因为该代码不会被执行。

【讨论】:

我在 SQL 研讨会中调试了代码,由于某种原因,它与 dbms_output.put_line('true/false') 一起工作得很好,并返回了正确的真/假值。但是,当我再次将其粘贴到应用程序中并将其更改回RETURN TRUE/FALSE 时,错误仍然存​​在。 equipstatus 和 equipid 列的数据类型是什么? Equipstatus 是 varchar2,equipID 是 number 有没有可能 :P3_EQUIPID 不是数字?也许它有前导/尾随空格或控制字符? 它应该是一个数字,只是为了确保我将其更改为to_number(trim(:P3_EquipID)),但它仍然不起作用。

以上是关于Oracle Apex 20.1 错误:处理验证时出错的主要内容,如果未能解决你的问题,请参考以下文章

Oracle APEX - 处理 APEX 内部错误

Oracle Apex 自定义身份验证错误 - “MY_AUTHENTICATION”不是一个过程

重复行 - 交互式网格 - Apex Oracle

在 Oracle apex 中的列上设置自定义验证

应用程序错误:ORA-19202:XML 处理中发生错误 ORA-01843:不是有效月份 - Oracle Apex

在将编辑内容保存到数据库之前验证 Oracle Apex 可编辑交互式网格