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

Stored procedures 如何在Firebird存储过程中对二进制blob执行更新?,stored-procedures,blob,firebird,firebird-3.0,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

挑战在于存储过程如何将二进制值组装到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位

您的代码不工作的原因是
转换(4 as blob(0))
将转换为
'4'
,实际上是0x34或十进制52

为了能够分配二进制值,您需要使用(Firebird 2.5中介绍的):


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

您使用的是哪种Firebird版本,答案可能会根据这一点而有所不同。交叉发布到:是的,我明白了,所以我在dba.stack上删除了它…,现在一切正常了,对吗?完美。这正是我要找的,但没有找到。我查阅了有关blob的Firebird文档,但没有提到在存储过程中使用二进制数据(可能我不知道如何正确搜索:)thanks@Majkl老实说,我也很难找到正确的参考资料。我的回答最初包括一个到Firebird 2.5发行说明的链接,直到后来我在Firebird 2.5语言参考中找到了正确的条目。我会看看我是否能改进这一点,正如我在“文字”一节中所期望的那样,但它是在“公共语言元素”下。他还可以介绍自己的BLOB类型,然后编写BLOB解释UDF
VAR_BLOB = x'04'