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 自定义身份验证错误 - “MY_AUTHENTICATION”不是一个过程