我有一张桌子,我必须一键更新多个记录。我正在尝试使用下面的简单查询更新多个记录。
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;
答案 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中使用对象的信息