оракул 06502 объявление char (1) - PullRequest
0 голосов
/ 05 июля 2018

у меня есть это ora-06502.

я объявил

**letter char(1);**

И я использую это объявление в

letter := substr(v_string,1,1);
v_string_bis := letter;
for i in 2..length(v_string) loop
if (substr(v_string,i,1) != letter) then
letter := substr(v_string,i,1);
v_string_bis:= v_string_bis||letter;
end if;
end loop;

После того, как я получу эту Ору. Я знаю, это проблема длины, но я, как я могу заменить этот символ (1)? от varchar2? или я должен увеличить до char (2), например?

Есть идеи, пожалуйста?

Спасибо

1 Ответ

0 голосов
/ 05 июля 2018

Вы добавляете только один символ за раз в переменную 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...