Запись пользовательской функции Firebird, возвращающей ОКТЕТЫ

Мы используем двоичное значение, которое хранится в таблицах как CHAR(18) CHARACTER SET OCTETS.

В Firebird 2.0.4 мы использовали ASCII как набор символов базы данных по умолчанию, так и набор символов соединения. У нас есть UDF, который может генерировать необходимые данные, которые определяются как:

DECLARE EXTERNAL FUNCTION CREATEBINARY
RETURNS CSTRING(76) 
ENTRY_POINT 'CREATEBINARY'
MODULE_NAME 'CustomUDF';

Получение значения с помощью

SELECT CREATEBINARY() FROM RDB$DATABASE

возвращает ожидаемое значение.

В Firebird 2.5.2 мы используем UTF8 как в качестве набора символов базы данных по умолчанию, так и в качестве набора символов соединения. Попытка вызвать нашу UDF с помощью приведенного выше оператора select теперь приводит к ошибке:

Context: Statement::Fetch
Message: idx_dsql_fetch failed.

SQL Message: -104
Invalid Token

Engine Code: 335544849
Engine Message:
Malformed string

Я попытался изменить объявление функции, чтобы указать набор символов результата как OCTETS и NONE:

DECLARE EXTERNAL FUNCTION CREATEBINARY
RETURNS CSTRING(76) CHARACTER SET OCTETS
ENTRY_POINT 'CREATEBINARY'
MODULE_NAME 'CustomUDF';

но я все еще получаю тот же результат ошибки.

Я протестировал это в FlameRobin 0.9.3.1870 и в нашем приложении, используя Delphi XE2 Update 4 и IBObjects 4.9 Release 14. Оба терпят неудачу одинаково.


person garethm    schedule 25.01.2013    source источник


Ответы (1)


Проблема заключается в том, что для возвращаемого результата указан неверный размер. Изменение декларации на

DECLARE EXTERNAL FUNCTION CREATEBINARY
RETURNS CSTRING(18) CHARACTER SET OCTETS
ENTRY_POINT 'CREATEBINARY'
MODULE_NAME 'CustomUDF';

заставляет функцию работать корректно.

person garethm    schedule 25.01.2013