编写Firebird UDF返回OCTETS

时间:2013-01-25 01:20:06

标签: firebird user-defined-functions firebird2.5

我们使用二进制值作为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作为默认数据库字符集和连接字符集。尝试使用上面的select语句调用我们的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.都以相同的方式失败。

1 个答案:

答案 0 :(得分:2)

问题似乎是为返回结果指定的大小不正确。将声明更改为

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

使该功能正常工作。