2013-01-25 42 views
3

我們利用存儲在表中的二進制值作爲CHAR(18)CHARACTER SET OCTETS。寫Firebird UDF返回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進行了測試。兩者都以相同的方式失敗。

回答

2

該問題似乎是爲返回結果指定的大小不正確。聲明更改爲

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

使正確的函數工作。