#sql #ibm-midrange
#sql #ibm-midrange
Вопрос:
У меня возникла проблема с функцией iSeries, из-за которой она неправильно преобразует данные, потому что мой профиль пользователя по умолчанию использует CCSID 65535. Я могу изменить задание на CCSID 37, и все работает нормально.
Мне нужно решение, при котором пользователю не нужно изменять свои рабочие свойства.
Функция запускает java-приложение и выглядит следующим образом
CREATE FUNCTION mylib/re_Test2(input VARCHAR(500) CCSID 37,
regex VARCHAR(500) CCSID 37)
RETURNS INTEGER
EXTERNAL NAME 'UDFs.re_Test'
LANGUAGE Java
PARAMETER STYLE Java
FENCED
NO SQL
RETURNS NULL ON NULL INPUT
SCRATCHPAD
DETERMINISTIC
Я попробовал это без использования CCSID 37 изначально, но нашел несколько сообщений, предполагающих, что добавление этого приведет к преобразованию любых параметров в US English. Похоже, у меня это не работает.
Есть предложения?
Я попытался запустить из STRSQL и скрипта RPGLE, но оба не работают, однако из SQLSquirrel (SQL-программа с открытым исходным кодом, использующая ODBC) она работает.
Ответ №1:
CCSID 65535 означает «нет перевода символов» … поэтому, если ваша таблица создана с определенным CCSID, я бы предложил запустить приложение с этим CCSID.
Комментарии:
1. В настоящее время я использую строковые литералы для тестирования, например,
select re_test('a','a') from sysibm/sysdummy1
это не работает. CCSID sysdummy1 равен 372. Если ваш CCSID задания равен 65535, то это ожидается … вы говорите системе НЕ выполнять перевод символов.
3. CCSID 65535 предназначен для неперевода; по сути, он определяется как «двоичный» (и я не могу понять, почему он так часто используется). Все, что используется в качестве CCSID получателя (например, 37), будет работать нормально , если это точно такой же CCSID, который использовался для ввода данных в первую очередь. В противном случае в преобразованных данных будут ошибки, которые не будут обнаружены, кроме как при визуальном осмотре. Программное обеспечение не выдает ошибок (за исключением случаев, когда CCSID недопустим для преобразования).
Ответ №2:
У меня была та же проблема. Я обнаружил, что это не касается параметров функции (у меня были целые числа).
Вопрос в том, как вы вызываете функцию. Например, в моем случае ее вызов с помощью System i Navigator работал, но не с программой RPG (которая, вероятно, использует пользовательский CCSID, то есть 65535).
Для последнего я решил CHGJOB CCSID(37)
(37 для «COM EUROPE EBCDIC», любой может выбрать правильную кодовую страницу), а затем снова CHGJOB CCSID(65535)
ввести.
Другой аналогичный способ CHGUSRPRF USRPRF(MYUSER) CCSID(37)
. Не нашел ничего лучшего…
Ответ №3:
Приведенный выше выбор тоже работает нормально, за исключением того, что если вы попытаетесь ввести переменную :INTO host в RPG, это приведет к ошибке. Решение состоит в том, чтобы выполнить chgjob с CCSID до 37, затем запустить встроенный SQL, а затем изменить CCSID задания обратно на 65535. Тогда все работает нормально. Если вам нужна дополнительная информация или образцы, отправьте мне электронное письмо по адресу William.Ramos@mohawkind.com для получения дополнительной информации. Я столкнулся с этой проблемой, используя функции КОДИРОВАНИЯ / декодирования в мире RPG. Спасибо.
Ответ №4:
используйте простое приведение, где CSSID 37 = CSSID 65535
,
Пример:
select cast( campo1 as varchar(500) CCSID 37 ) from biblioteca.tabla
db2 необычно
Ответ №5:
Решение состоит в том, чтобы сделать CHGUSRPRF CCSID равным 37, затем запустить встроенный SQL, а затем изменить CCSID задания обратно на 65535. Тогда все работает нормально.