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

Posted

技术标签:

【中文标题】获取 ORA-06502:PL/SQL:数字或值错误:SQL 触发器中的字符到数字转换错误【英文标题】:Getting ORA-06502: PL/SQL: numeric or value error: character to number conversion error in SQL trigger 【发布时间】:2018-07-10 12:19:29 【问题描述】:

我在具有 MIH_TRIGGER 的表上的 Web 方法适配器中遇到错误。

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

下面是 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_VALUE varchar2 列并收到此错误。

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; 

您能否提出一个解决方案,以便我可以相应地修改上述触发器。

提前感谢您的帮助。

问候 帕尼

【问题讨论】:

OFFSET 列是数字,但您正在检查 nvl(offset, 'xYz#@!0')。这是错误的。在 NVL 中,两个参数应该是相同的数据类型 显示表OPS_BUILD_MIHOPS_BUILD_AUDITLOG的定义。人们可以更轻松地模拟您的问题。 感谢 Kaushik 的快速浏览。如果没有这个 'xYz#@!' 表达式,我们会收到 nvl(:OLD.OFFSET,'xYz#@!') != nvl(:NEW.OFFSET,'xYz#@!') 的编译错误,因此它就在那里。你有什么建议可以解决吗? OPS_BUILD_MIH 表:名称空类型 ----------- -------- ----- -------- MIH_ID NOT NULL VARCHAR2(40) LOB VARCHAR2(40) OFFSET NOT NULL NUMBER PROGRAM_ID NOT NULL VARCHAR2(40) SITE_ID NOT NULL VARCHAR2(40) ACTIVITY_LABEL_ID NOT NULL VARCHAR2(40) 下面是结构 OPS_BUILD_AUDITLOG Name Null Type ----------- ---- ------------- TABLE_NAME VARCHAR2(40) COLUMN_NAME VARCHAR2(40) OLD_VALUE VARCHAR2(400) NEW_VALUE VARCHAR2(400) 【参考方案1】:

正如 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)

这样,您就不必编造一个实际值永远不可能的幻数;假设这样的数字甚至存在!

【讨论】:

以上是关于获取 ORA-06502:PL/SQL:数字或值错误:SQL 触发器中的字符到数字转换错误的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL: 数字或值错误 - ORA-06502

oracle 11g ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小

ORA-06502 PL/SQL:数字或值错误:字符到数字的转换错误;

ORA-06502: PL/SQL: 数字或值错误: 数字精度太大

ORA-06502: PL/SQL: 数字或值错误: NULL 索引表键值

ORA-06502: PL/SQL: 数字或值错误: 字符到数字的转换错误