【发布时间】:2020-01-14 21:49:37
【问题描述】:
我知道当我尝试将无效字符转换为数字时会发生 ORA-01722。例如:“a123”。在这种情况下,我只尝试创建一个 where 条件,其中参数是表的 ID,参数是根据表类型定义的。
PROCEDURE SP_CPR_AGRUPAR_COMPRA(ID_SOLICITUD IN cpr_solicitud.id%type, ID_GRUPO IN cpr_solicitud.ID_GRUPO%type ) AS
BEGIN
UPDATE cpr_solicitud
SET ID_GRUPO=ID_GRUPO
WHERE id=ID_SOLICITUD;
END SP_CPR_AGRUPAR_COMPRA;
我尝试使用 TO_NUMBER 函数格式化 ID_SOLICITUD,但错误仍然存在。像这样的:
UPDATE cpr_solicitud
SET ID_GRUPO=ID_GRUPO
WHERE id=TO_NUMBER(ID_SOLICITUD);
我做了一个直接传递信息的测试,它可以工作。
UPDATE cpr_solicitud SET ID_GRUPO = 18 WHERE id = 942000;
我做了很多测试,结论是错误与ID_SOLICITUD参数有关。我不知道为什么,但如果我通过了 ID_GRUPO 并离开了 ID_SOLICITUD,它就可以工作。
成功了:
UPDATE cpr_solicitud
SET ID_GRUPO=ID_GRUPO
WHERE id=1
这行不通:
UPDATE cpr_solicitud
SET ID_GRUPO=1
WHERE id=TO_NUMBER(ID_SOLICITUD);
【问题讨论】:
-
cpr_solicitud.id 的数据类型是什么?另外,
SET ID_GRUPO=ID_GRUPO可能没有做你想做的事。 -
你的表是否也有一个名为
ID_SOLICITUD的列? -
@BobJarvis-ReinstateMonica 表中的数据类型是 NUMBER(38,0)。 ID_GRUPO。它是与具有相同数据类型的其他表的外键(NUMBER(38,0))
-
@AlexPoole 是的。但在这种情况下 ID_SOLICITUD 是表中的 ID。这只是参数名称(我知道,这可能会造成混淆)
-
不,不是“可能”;它是混乱的,所以Oracle 有固定的规则来解决混乱。 You're seeing the documented behaviour.
标签: oracle