sql - 获取 ORA-06502:PL/SQL:数字或值错误:SQL 触发器中的字符到数字转换错误
问题描述
我在具有 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;
您能否建议对此进行修复,以便我可以相应地修改上述触发器。
提前感谢您的帮助。
问候帕尼
解决方案
正如 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)
这样,您就不必编造一个实际值永远不可能的幻数;假设这样的数字甚至存在!
推荐阅读
- python - 在简单的 2D Python 游戏中更新角色的位置
- laravel - 在 twilio laravel 中按区号阻止呼叫
- php - 运行异步while函数或多线程
- ios - 使用蓝牙时如何设置超时间隔
- python - 使用大量“if”语句的替代方法
- java-8 - 带有 RadixSort、BucketSort、Java 8 的比较器接口
- javascript - 如何编写一个可以接受一个或多个参数并返回加法的函数
- java - 错误 - 在 Jparepository 中不起作用的日期之间
- android - Android 蓝牙信标唯一标识符
- python - animation.FuncAnimation 贴图