ora-01722 неверный номер при обновлении записи - PullRequest
0 голосов
/ 05 октября 2018

У меня есть таблица, где мне нужно обновить несколько записей одним нажатием кнопки.Я пытаюсь обновить несколько записей, используя ниже простой запрос.

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

, где тип данных idcolumn равен Number.Если я запускаю этот запрос вручную, он работает отлично.Но если я пропущу эти ('1', '2', '3') параметры через процедуру, то это покажет мне ошибку ниже, т.е. (недопустимое число ora-01722).

Я пытался использовать функцию to_number (), новсе еще он показывает мне ошибку выше.

Proc:

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 голосов
/ 05 октября 2018

Процедура не понимает 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 и использовать его в обновлении.Существует много информации о том, как это сделать.Например, Преобразование разделенной запятыми строки в массив в PL / SQL А вот информация о том, как использовать объект в предложении IN Массив в предложении IN () oracle PLSQL

...