Проблема с набором символов во время выполнения программы RPG при вызове процедуры магазина iSeries db2

У меня есть хранимая процедура db2, как показано ниже. Этот процесс вызывает CL для вызова программы RPG.

CREATE PROCEDURE bsm4obj/TXCL4055            
(                                            
INOUT POCNO CHAR (10),                       
INOUT POCRN DEC ( 2 , 0 ),                   
INOUT PSPNO CHAR (10),                       
INOUT PMTAD CHAR (1),                        
INOUT PYREX CHAR (1),                        
INOUT PMTYR CHAR (1),                        
INOUT PKMLK CHAR (10),                       
INOUT HATVR CHAR (1)                         
)                                            
LANGUAGE CL NOT DETERMINISTIC NO SQL EXTERNAL
NAME bsm4obj/txCL4055 PARAMETER STYLE GENERAL

Я вызываю этот процесс с сервера. (Идентификатор языка ODBC турецкий);

OdbcCommand cmd = new OdbcCommand("{CALL BSM4OBJ.TXCL4055(?,?,?,?,?,?,?,?)}", as400con);
cmd.CommandType = CommandType.Text;

При выполнении программы RPG (на шаге, подобном приведенному ниже) переменная 'ŞŞ' не распознается компилятором, как это было, а '@@'.

ЦДЕПР ИФЕК 'ŞŞ'

// читаем как ЦДЕПР IFEQ '@@'

Программа отлично работает в сеансе QPADEV на As400, но при вызове SQL не ведет себя так.

Я заменил турецкие статические символы на эквивалентные символы для временных в RPG. Но я хочу найти точное решение. Я буду очень рад, если вы предложите

1 ответ

По умолчанию RPG не всегда правильно обрабатывает символьные литералы. Он сохраняет шестнадцатеричное значение литерала в CCSID во время компиляции, но интерпретирует шестнадцатеричное значение в CCSID задания.

Начиная с версии 7.2, вы можете кодировать ключевое слово CCSID спецификации H (*EXACT), и это заставит RPG запомнить истинный CCSID символьных литералов.

Другой обходной путь - это кодирование литерала с помощью%UCS2.

if TSDEPR = %ucs2('ŞŞ');
Другие вопросы по тегам