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 を使用するアプリケーションでテストしました。どちらも同じように失敗します。

4

1 に答える 1

2

問題は、返される結果に指定されたサイズが正しくないことにあるようです。宣言を次のように変更します

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

関数が正しく動作するようにします。

于 2013-01-25T01:31:10.617 に答える