如何在 Firebird 存储过程中对二进制 blob 执行更新?
How to perform update on binary blob in Firebird stored procedure?
挑战是在存储过程中将 assemble 二进制值转换为 blob,然后保存 table。问题是存储过程将 blob 作为文本工作,例如,如果我想插入 blob 字节 4,则插入字节 52(对于字节 ASCII 编号 4)。
我尝试了不同的演员阵容,但没有任何效果。如果存储过程将 blob 更新为 table,这是函数的参数,那么它工作正常。
如何在存储过程中使用二进制值(完整字节)?
CREATE PROCEDURE PROC__TESTBLOB (
INID Integer,
INDATABLOB Blob sub_type 0 )
RETURNS (
RESULT Varchar(20) )
AS
DECLARE VARIABLE VAR_BLOB blob sub_type 0;
BEGIN
BEGIN
BEGIN
--update tab_test set datablob = :INDATABLOB where id = :INID; --This work fine
VAR_BLOB = CAST(4 AS BLOB(0));--not work, blob is still byte 52 (ascii number 4)
VAR_BLOB = 3;--not work, blob is still byte 51 (ascii number 3)
update tab_test set datablob = :VAR_BLOB where id = :INID;--This does not work
RESULT = 'OK';
END
WHEN ANY DO RESULT = 'ERR';
END
SUSPEND;
END^
更新
火鸟版本 3.0.0.32483 64 位
您的代码不起作用的原因是 cast(4 as blob(0))
将转换为 '4'
,这确实是 0x34 或十进制 52。
为了能够分配二进制值,您需要使用binary string literals(在 Firebird 2.5 中引入):
VAR_BLOB = x'04'
请注意,二进制文字由成对的十六进制数字组成。
挑战是在存储过程中将 assemble 二进制值转换为 blob,然后保存 table。问题是存储过程将 blob 作为文本工作,例如,如果我想插入 blob 字节 4,则插入字节 52(对于字节 ASCII 编号 4)。
我尝试了不同的演员阵容,但没有任何效果。如果存储过程将 blob 更新为 table,这是函数的参数,那么它工作正常。
如何在存储过程中使用二进制值(完整字节)?
CREATE PROCEDURE PROC__TESTBLOB (
INID Integer,
INDATABLOB Blob sub_type 0 )
RETURNS (
RESULT Varchar(20) )
AS
DECLARE VARIABLE VAR_BLOB blob sub_type 0;
BEGIN
BEGIN
BEGIN
--update tab_test set datablob = :INDATABLOB where id = :INID; --This work fine
VAR_BLOB = CAST(4 AS BLOB(0));--not work, blob is still byte 52 (ascii number 4)
VAR_BLOB = 3;--not work, blob is still byte 51 (ascii number 3)
update tab_test set datablob = :VAR_BLOB where id = :INID;--This does not work
RESULT = 'OK';
END
WHEN ANY DO RESULT = 'ERR';
END
SUSPEND;
END^
更新 火鸟版本 3.0.0.32483 64 位
您的代码不起作用的原因是 cast(4 as blob(0))
将转换为 '4'
,这确实是 0x34 或十进制 52。
为了能够分配二进制值,您需要使用binary string literals(在 Firebird 2.5 中引入):
VAR_BLOB = x'04'
请注意,二进制文字由成对的十六进制数字组成。