Проблема с набором символов во время выполнения программы 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('ŞŞ');