当前位置: 首页 > 知识库问答 >
问题:

获取ORA-06502:PL/SQL:数字或值错误:SQL触发器中的字符到数字转换错误

章振
2023-03-14

下面是表上web方法适配器的错误,该适配器具有MIH_触发器。

(65000/6502)ORA-06502:PL/SQL:数字或值错误:字符到数字转换错误ORA-06512:在“B2B_OPS_BUILD_ADMIN.MIH_TRIGGER”第2行ORA-04088:执行触发器“B2B_OPS_BUILD_ADMIN”时出错。米尤触发器'

下面是MIH_TRIGGER引用,每当更新OFFSET列时,它将OPS_BUILD_MIH数据更新到OPS_BUILD_AUDITLOG表。

OPS_BUILD_MIH中的OFFSET列为NUMBER

OPS_BUILD_AUDITLOG中的OLD_VALUE和NEW_VALUE列是VARCHAR2(100)。

我试图插入一个数值,这是在OFFSET列到OLD_VALUE和NEW_VALUEvarchar2列,并得到这个错误。

create or replace TRIGGER "B2B_OPS_BUILD_ADMIN"."MIH_TRIGGER" 
AFTER UPDATE OF OFFSET
ON OPS_BUILD_MIH
FOR EACH ROW
BEGIN
 if ( nvl(:OLD.OFFSET,'xYz#@!0') != nvl(:NEW.OFFSET,'xYz#@!0')) then
  INSERT INTO OPS_BUILD_AUDITLOG
    (TABLE_NAME,
     COLUMN_NAME,
     OLD_VALUE,
     NEW_VALUE,
     UPDATED_BY,
     UPDATED_DTM,
     UUID)
  VALUES  
    ('OPS_BUILD_MIH',
     'OFFSET',
     :OLD.OFFSET,
     :NEW.OFFSET,
     :NEW.LAST_UPDATED_BY,
     :NEW.LAST_UPDATED_DTM,
     :OLD.MIH_ID);
 end if;

END; 

你能不能建议一个解决方案,这样我就可以相应地修改上面的触发器。

提前感谢你的帮助。

问候帕尼

共有1个答案

元俊雅
2023-03-14

正如Gaj已经指出的,问题在于你的NVL——你试图将一个非数字字符串与一个数字进行比较,这是行不通的。

虽然您可以更改NVL以检查您永远不会遇到的数值,但最好将条件更改为:

:OLD.OFFSET != :NEW.OFFSET
or (:OLD.OFFSET is not null and :NEW.OFFSET is null)
or (:OLD.OFFSET is null and :NEW.OFFSET is not null)

这样,你就不必编造一个神奇的数字,而你的实际值永远不可能是这个数字;假设这样一个数字真的存在!

 类似资料:
  • 有没有办法在mybatis结果映射中指定一个字符串最多应包含20个字符?或者如何设置精度,如数字(4,2)? 例如,我有一个如下所示的结果图: 我可以将int的位数限制为只有1,在浮点数上的“.”后面显示N个元素,或者将字符串大小限制为一定的数字吗? 我正在处理的视图具有以下列结构: 编辑1:每当我试图调用存储过程在此视图中添加新项时...我会得到这个错误: 我创建了一个用于测试的类,该类尝试调用

  • 在函数中,我在这一行上有ORA-06502错误: 我看这里没有任何转换问题/完全困惑/

  • 我试图插入一个记录到oracle数据库使用一个过程。记录已插入,但出现异常。 将上述代码调用为: 以上代码调用以下过程; 执行语句时发生错误 组织。springframework。jdbc。BadSqlGrammarException:CallableStatementCallback;错误的SQL语法[{调用MYPROCEDURE(?,,,,,,,,,,,,,,,,,?)}];嵌套的异常是jav

  • 我得到了 ORA-06502:PL/SQL:以下代码中出现数值或值错误:

  • 我在执行触发器时遇到以下错误: 请说明问题的原因。 编辑 数据类型:

  • 我以不同的方式尝试了以下代码,比如去掉while或if,但是当我把它们放在一起(if和while)时,我总是在最后得到错误。。。 错误: 通过将变量“a”的声明方式更改为: *注意,这里的显著变化是使用VARCHAR2而不是CHAR(不是更大的长度)。根据@user272735的回答,这是关键。