编写返回OCTETS的Firebird UDF

3
我们使用的是二进制值,该值存储在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个回答

2
问题似乎在于返回结果指定的尺寸不正确。将声明更改为:
DECLARE EXTERNAL FUNCTION CREATEBINARY
RETURNS CSTRING(18) CHARACTER SET OCTETS
ENTRY_POINT 'CREATEBINARY'
MODULE_NAME 'CustomUDF';

使函数正确工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接