ora-01722无效数字,同时更新记录

时间:2018-10-05 05:54:28

标签: oracle oracle11g oracle10g

我有一张桌子,我必须一键更新多个记录。我正在尝试使用下面的简单查询更新多个记录。

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

其中idcolumn的数据类型为Number。如果我手动运行此查询,则可以正常运行。但是,如果我通过过程传递了这些('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;

1 个答案:

答案 0 :(得分:0)

该过程无法将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,这里是如何在条款Array in IN() clause oracle PLSQL中使用对象的信息