【问题标题】:ora-01722 invalid number while updating recordora-01722 更新记录时数字无效
【发布时间】:2019-03-10 13:52:25
【问题描述】:

我有一个表,我必须单击一次按钮更新多个记录。我正在尝试使用以下简单查询更新多条记录。

UPDATE tablename SET column1=1 WHERE     
idcolumn IN ('1','2','3') 

其中 idcolumn 的数据类型是数字。如果我手动运行此查询,它会完美运行。但是,如果我通过程序传递这些 ('1','2','3') 参数,那么它会显示以下错误,即(ora-01722 无效数字)。

我尝试了 to_number() 函数,但它仍然显示我上面的错误。

过程:

CREATE OR REPLACE PROCEDURE procname(idpara  VARCHAR2,
                                 RCT_OUT OUT SYS_REFCURSOR) IS
BEGIN
  UPDATE tablename SET column1 = 1 WHERE idcolumn IN (idpara);
  COMMIT;
  OPEN RCT_OUT FOR
    SELECT 'RECORD UPDATED SUCCESSFULLY' RESULT FROM DUAL;
END;

【问题讨论】:

  • 向我们展示您的程序代码。看起来你正在传递整个字符串。
  • 这听起来很奇怪,但几乎可以肯定问题与您的数据有关。您需要发布一个可重现的测试用例,其中包含一些演示错误的示例数据。
  • 对我来说,这听起来像是 IN 列表中的变化元素 问题(正如您提到的“过程”和“传递参数”)。不过,可以肯定的是,您应该发布一个测试用例(正如您已经被告知的那样)。
  • idpara 是一个包含非数字值1,2,3字符串。这已经出现了很多次了。请阅读this threadthe thread it duplicates 了解所有选项。

标签: oracle oracle11g oracle10g


【解决方案1】:

该过程不理解 IN (idpara) 与 idpara 为 '1','2','3'IN ('1','2','3') 但为 IN (q'!'1','2','3'!')。换句话说,它不是在搜索'1''2''3',而是在搜索'1,2,3'。但是虽然'1'可以转换成数字'1,2,3'却不行。

这里有一个测试用例给你看:

select * from dual;
-- X
-- notice I have 'X' in the in list below

set serveroutput on 
declare
idpara varchar2(400) := q'!'X','2','3'!';
v_out varchar2(400);
begin 
select count(*) into v_out from dual where dummy in (idpara);
dbms_output.put_line(v_out);
end;
/
-- 0

declare
idpara varchar2(400) := q'!'X','2','3'!';
v_out varchar2(400);
sql_stmt VARCHAR2(1000) := NULL;
begin 
sql_stmt :='select count(*) from dual where dummy in ('||idpara||')';
execute immediate sql_stmt into v_out;
dbms_output.put_line(v_out);
end;
/
-- 1

procname 内部的一个解决方案是构建数字的 pl/sql 对象并在更新中使用它。有很多关于如何做到这一点的信息。例如。这里Convert comma separated string to array in PL/SQL这里是关于如何在IN子句Array in IN() clause oracle PLSQL中使用该对象的信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多