Вы добавляете только один символ за раз в переменную letter
, по крайней мере, в показанном вами коде, поэтому при условии, что в сообщении об ошибке указано, что это одно из тех назначений, которое выбрасывает ORA-06502, вы можете просто есть многобайтовые символы.
Если ваша семантика БД / сеанс длины установлена на byte
, то вы объявляете однобайтовую переменную. Вы, вероятно, просто хотите, чтобы это был один символ:
letter char(1 char);
или (поскольку на самом деле нет никакой причины использовать char
, даже для одного символа):
letter varchar2(1 char);
Также возможно, что конкатенация к переменной v_string_bis
приводит к тому, что она превышает максимальную объявленную длину, что также может быть расхождением байтов / символов; но так как мы не знаем, как это объявлено сейчас или как долго исходные строки, мы не знаем, так ли это. Сообщение об ошибке будет указывать на строку с этим назначением, если бы это было причиной.
Чтобы продемонстрировать разницу, которую может дать определение семантики:
declare
letter char(1 byte);
begin
letter := unistr('\00a0');
end;
/
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 4
declare
letter varchar2(1 byte);
begin
letter := unistr('\00a0');
end;
/
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 4
declare
letter char(1 char);
begin
letter := unistr('\00a0');
end;
/
PL/SQL procedure successfully completed.
declare
letter varchar2(1 char);
begin
letter := unistr('\00a0');
end;
/
PL/SQL procedure successfully completed.