Amid написал(а):
bmonk написал:
Возможны траблы с русской кодировкой (это зависит от кодовой странички SAPовского сервера ORACLE). Это тоже в принципе рашаемо
Можно по подробнее как победить "траблы" с русской кодировкой!
Был бы очень благодарен, так как есть такая проблемма, а решить её никак не получается!

Все дело в кодировке. Можно написать конвертор с we8dec в cl8mswin1251 и обратный с cl8mswin1251 в we8dec. Если на уровне Оракла, то будет выглядеть так:
Code:
create or replace function we8dec_cl8mswin1251(a in varchar2) return varchar2
is
vv varchar2(2000) := '';
j number;
jj number;
dd number := 16;
begin
if a is null then
return null;
end if;
for i in 1..length(a) loop
j := ascii(substr(a,i,1));
if (j >= 176 and j <= 239) then
jj := j + dd;
elsif j = 241 then
jj := 184;
elsif j = 240 then
jj := 185;
elsif j = 161 then
jj := 168;
else
jj := j;
end if;
vv := vv||chr(jj);
end loop;
return vv;
end;
Обратный если будет нужен могу прописать. Но когда я выгружаю с приложения т.е. с САП-а, кодировка почемуто сбивается, поэтому сделал простой переводчик со стороны САП и конвертер с другой. В общем выглядет это, так: ФМ(в САП)
data i type i.
data outchar type c.
i = 0.
while i < strlen( str ).
case str+i(1).
WHEN 'А'.
outchar = 'A'.
WHEN 'Б'.
outchar = 'B'.
WHEN 'В'.
outchar = 'C'.
WHEN 'Г'.
outchar = 'D'.
WHEN 'Д'.
outchar = 'E'.
WHEN 'Е'.
outchar = 'F'.
WHEN 'Ё'.
outchar = ')'.
WHEN 'Ж'.
outchar = 'G'.
WHEN 'З'.
outchar = 'H'.
WHEN 'И'.
outchar = 'I'.
WHEN 'Й'.
outchar = 'J'.
WHEN 'К'.
outchar = 'K'.
WHEN 'Л'.
outchar = 'L'.
WHEN 'М'.
outchar = 'M'.
WHEN 'Н'.
outchar = 'N'.
WHEN 'О'.
outchar = 'O'.
WHEN 'П'.
outchar = 'P'.
WHEN 'Р'.
outchar = 'Q'.
WHEN 'С'.
outchar = 'R'.
WHEN 'Т'.
outchar = 'S'.
WHEN 'У'.
outchar = 'T'.
WHEN 'Ф'.
outchar = 'U'.
WHEN 'Х'.
outchar = 'V'.
WHEN 'Ц'.
outchar = 'W'.
WHEN 'Ч'.
outchar = 'X'.
WHEN 'Ш'.
outchar = 'Y'.
WHEN 'Щ'.
outchar = 'Z'.
WHEN 'Ъ'.
outchar = '['.
WHEN 'Ы'.
outchar = '\'.
WHEN 'Ь'.
outchar = ']'.
WHEN 'Э'.
outchar = '^'.
WHEN 'Ю'.
outchar = '_'.
WHEN 'Я'.
outchar = '`'.
WHEN 'а'.
outchar = 'a'.
WHEN 'б'.
outchar = 'b'.
WHEN 'в'.
outchar = 'c'.
WHEN 'г'.
outchar = 'd'.
WHEN 'д'.
outchar = 'e'.
WHEN 'е'.
outchar = 'f'.
WHEN 'ё'.
outchar = '9'.
WHEN 'ж'.
outchar = 'g'.
WHEN 'з'.
outchar = 'h'.
WHEN 'и'.
outchar = 'i'.
WHEN 'й'.
outchar = 'j'.
WHEN 'к'.
outchar = 'k'.
WHEN 'л'.
outchar = 'l'.
WHEN 'м'.
outchar = 'm'.
WHEN 'н'.
outchar = 'n'.
WHEN 'о'.
outchar = 'o'.
WHEN 'п'.
outchar = 'p'.
WHEN 'р'.
outchar = 'q'.
WHEN 'с'.
outchar = 'r'.
WHEN 'т'.
outchar = 's'.
WHEN 'у'.
outchar = 't'.
WHEN 'ф'.
outchar = 'u'.
WHEN 'х'.
outchar = 'v'.
WHEN 'ц'.
outchar = 'w'.
WHEN 'ч'.
outchar = 'x'.
WHEN 'ш'.
outchar = 'y'.
WHEN 'щ'.
outchar = 'z'.
WHEN 'ъ'.
outchar = '['.
WHEN 'ы'.
outchar = '|'.
WHEN 'ь'.
outchar = '}'.
WHEN 'э'.
outchar = '~'.
WHEN 'ю'.
outchar = '#'.
WHEN 'я'.
outchar = '$'.
WHEN OTHERS.
outchar = str+i(1).
endcase.
if outchar = space.
CONCATENATE outstr outchar into outstr SEPARATED BY '&'.
else.
CONCATENATE outstr outchar into outstr.
endif.
add 1 to i.
ENDWHILE.
И конвертор на базе Оракла:
create or replace function en_ru(str in varchar2) return varchar2 is
Result varchar2(2000);
i integer;
temp integer;
r varchar2(1);
j integer;
begin
for i in 1..length(str) loop
SELECT ASCII(substr(str,i,1)) into temp FROM dual;
if temp = 35 then temp := 127; end if;
if temp = 36 then temp := 128; end if;
if temp = 38 then temp := -95; end if;
j := temp+127;
r := chr(j);
result := result||r;
--result := result||substr(str,i,1)||'-'||r||'.';
end loop;
return(Result);
end en_ru;
Сделал, работает. Но думаю можно было бы на много короче. Но пока для тестирования пойдет, если какие будуд грейды, напишу. Надеюсь поможет
