如何在Firebird存储过程中对二进制blob执行更新?

时间:2016-12-19 08:28:40

标签: stored-procedures blob firebird firebird-3.0

挑战在于存储过程将二进制值组合到blob然后保存表。问题是存储过程使用blob作为文本,例如,如果我想插入blob字节4,则插入字节52(对于字节ASCII编号4)。

我尝试了不同的演员,但没有任何作用。如果存储过程更新blob到表中,这是函数的参数,那么它可以正常工作。

如何在存储过程中使用二进制值(完整字节)?

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^

更新 Firebird版本3.0.0.32483 64位

1 个答案:

答案 0 :(得分:2)

您的代码无法正常工作的原因是,cast(4 as blob(0))将转换为'4',确实是0x34或小数52.

为了能够分配二进制值,您需要使用binary string literals(在Firebird 2.5中引入):

VAR_BLOB = x'04'

请注意,二进制文字由十六进制数字对组成。