Символ с путаницей бит / гекс в DB2 - PullRequest
0 голосов
/ 22 февраля 2020

Это работает:

SELECT TASKT_ID FROM DATA . TASKT WHERE TASK_WEB_IDENTIFIER = CAST ( HEXTORAW ( '0213725501A421D384233E5001' ) AS CHAR ( 26 ) ) ;

После этой работы я поместил ее в процедуру:

BEGIN

DECLARE GET_TASKT_ID_BY_TASK_WEB_IDENTIFIER_C1 CURSOR WITH RETURN FOR
SELECT TASKT_ID FROM DATA . TASKT WHERE TASK_WEB_IDENTIFIER = CAST ( HEXTORAW ( P_WEB_IDENTIFIER ) AS CHAR ( 26 ) ) ;

OPEN GET_TASKT_ID_BY_TASK_WEB_IDENTIFIER_C1 ;
END 

У процедуры есть один параметр P_WEB_IDENTIFIER, который является CHAR (26) для бита данные с CCSID 65535

Однако, когда я теперь вызываю их со строкой, подобной следующей:

call PROGRAM . GET_TASKT_ID_BY_TASK_WEB_IDENTIFIER ('0213725501A421D384233E5001');

Я получаю обратно, что аргумент для VARBINARY_FUNCTION недопустим по длине или типу данных.

Кроме того, это работает:

call PROGRAM . GET_TASKT_ID_BY_TASK_WEB_IDENTIFIER (CAST('0213725501A421D384233E5001' as char(26)));

Что я могу сделать, чтобы убедиться, что строка преобразуется с передачей только строки?

1 Ответ

1 голос
/ 24 февраля 2020

Что вы используете для вызова хранимой процедуры?

Какая версия и выпуск Db2 для i?

В компоненте Run SQL Scripts IBM ACS или более ранняя версия Access для Windows, строковые литералы в ваших операторах рассматриваются как varchar.

Таким образом, CAST('0213725501A421D384233E5001' as char(26)) имеет смысл. Что не является сообщением об ошибке. Как правило, вы получите ошибку не найдена ошибка, поскольку БД ищет процедуру с именем PROGRAM.GET_TASKT_ID_BY_TASK_WEB_IDENTIFIER, которая принимает параметр varchar, и единственное, что существует, это процедура, которая принимает char (26) .

Инструменты IBM стали лучше при неявном преобразовании при необходимости. Но я обычно go с явным преобразованием при тестировании вручную (как вы сделали здесь). Или я просто сделаю паркс varchar для начала. И при необходимости преобразуйте в символ в процедуре.

Различие char / varchar обычно не имеет значения для клиентского кода, так как оно может быть указано c в определениях его типов. Это только фактор для интерактивных инструментов, таких как ACS, которые выполняют динамические операторы c.

...