Oracle объявляет выбор в операторе обновления, не работает

У меня была проблема, из-за которой из-за кодировки базы данных специальные символы получали странные коды к ним, то, получив select ascii(substr(declinereasondesc, 30,1)) from DECLINEREASON t where declinereasonid = 7;, я получил код (49827) для £ в кодировке db. Затем я попытался обновить записи в базе данных.

Проблема, которую я получаю, заключается в том, что данные не сохраняются в БД или значение selecting into для varchar2(6); каким-то образом изменяет его, и оно больше не соответствует REGEXP_REPLACE.

Произошла ошибка, когда я попытался использовать varchar2(1), которое должно иметь значение, что может быть подсказкой.

declare c varchar2(6);
begin 
select ascii(substr(declinereasondesc, 30,1)) into c from DECLINEREASON t
where declinereasonid = 7;
begin 
  update DECLINEREASON set declinereasondesc = REGEXP_REPLACE(declinereasondesc, '(.+)('||c||')(\d+)', '\1\3 (GBP)');
  commit;
  end;
end;
/
commit;

Обновление: пробовал declare c number; без ошибок, но не обновлял значения эфира


person Matas Vaitkevicius    schedule 19.11.2014    source источник
comment
Нет пункта where в операторе update?!?   -  person Erich Kitzmueller    schedule 19.11.2014
comment
@ammoQ это не нужно, regex_replace, которое не соответствует, возвращает его входное значение.   -  person Matas Vaitkevicius    schedule 19.11.2014
comment
но это по-прежнему означает, что оператор обновления по-прежнему влияет на все строки в DECLINEREASON, что может вызвать нежелательные побочные эффекты (снижение производительности, срабатывание триггеров, блокировки...), даже если обновление само по себе не имеет никакого эффекта.   -  person Erich Kitzmueller    schedule 19.11.2014
comment
@ammoQ, ты абсолютно прав   -  person Matas Vaitkevicius    schedule 19.11.2014


Ответы (1)


Это было вызвано моей глупостью - забыл обернуть c в chr(c).

declare c number;
begin 
select ascii(substr(declinereasondesc, 30,1)) into c from DECLINEREASON t
where declinereasonid = 7;
begin 
  update DECLINEREASON set declinereasondesc = REGEXP_REPLACE(declinereasondesc, '(.+)('||chr(c)||')(\d+)', '\1\3 (GBP)');
  commit;
  end;
end;
/
  commit;
person Matas Vaitkevicius    schedule 19.11.2014