Писане на Firebird UDF, връщащи OCTETS

Ние използваме двоична стойност, която се съхранява в таблици като 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 с горния оператор за избор сега води до грешка:

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