firebird - 编写 Firebird UDF 返回 OCTETS

标签 firebird user-defined-functions firebird2.5

我们使用以 CHAR(18) 字符集八位字节形式存储在表中的二进制值。

在 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 的应用程序中对此进行了测试。两者都以相同的方式失败。

最佳答案

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

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

使函数正常工作。

关于firebird - 编写 Firebird UDF 返回 OCTETS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14513837/

相关文章:

sql-server-2008 - Firebird FDB 链接服务器 SSMS

php - 允许的内存大小为 134217728 字节耗尽(尝试分配 18063885380364533825 字节)

r - 我可以在用户定义的函数中使用 ggplot() 在单个图中绘制多个函数曲线吗?

sql - 在 firebird 中使用 iif 更新 varchar 字段时出现空格

sql - 如何在 Firebird select 语句中创建从 1 到 100 的范围?

Delphi 2010 和 Firebird 1.5

delphi - TpFIBTransaction 给出错误 : Transaction is not active in Delphi XE4 with FIBPlus 7. 5

MySQL 用户定义函数发送 windows 消息

python - 从 LibreCalc 中调用 python 函数

c# - Entity Framework 和 Firebird DB 方言 1 - 不生成兼容的 sql