Postgresql 博士后补习

Postgresql 博士后补习,postgresql,stored-procedures,type-conversion,bytea,Postgresql,Stored Procedures,Type Conversion,Bytea,我在postgres中有一个带有如下变量的存储过程 DECLARE totLen BYTEA; BEGIN totLen = E'\\x000034'; .... totLen必须正好是3个字节,我必须对其他值求和,如 totLen = totLen + 1; 我尝试使用totLen=totLen+E'\x01',但不起作用。 正确的解决方案是什么?这是一个函数,它将bytea值b的偏移量offs中的三个字节视为三字节的大端整数,并将i添加到该数字: CRE

我在postgres中有一个带有如下变量的存储过程

DECLARE 
    totLen  BYTEA;
BEGIN 
     totLen = E'\\x000034';
     ....
totLen必须正好是3个字节,我必须对其他值求和,如

totLen = totLen + 1;
我尝试使用totLen=totLen+E'\x01',但不起作用。
正确的解决方案是什么?

这是一个函数,它将
bytea
b
的偏移量
offs
中的三个字节视为三字节的大端整数,并将
i
添加到该数字:

CREATE OR REPLACE FUNCTION add(b bytea, offs integer, i integer) RETURNS bytea
   LANGUAGE plpgsql IMMUTABLE STRICT AS
$$DECLARE
   result integer := get_byte(b, offs) * 65536 +
                     get_byte(b, offs + 1) * 256 +
                     get_byte(b, offs + 2) +
                     i;
BEGIN
   IF result > 16777215 THEN
      RAISE EXCEPTION 'addition overflows';
   END IF;

   RETURN set_byte(
             set_byte(
                set_byte(
                   b,
                   offs,
                   result / 65536
                ),
                offs + 1,
                (result % 65536) / 256
             ),
             offs + 2,
             result % 256
          );
END;$$;

你想达到什么目标?为什么PL/pgSQL变量的长度对您很重要?这不是重点,但您想知道我正在编写BUFR()消息。问题是:为什么您关心变量的长度?您不能对
bytea
值进行算术运算。你很有可能以一种更简单的方式实现你想要做的事情。如果你能分享你正在做的事情的大图就好了。因为我写的东西需要使用固定的字节长度,所以,例如,totLen必须正好是3个字节,它是动态构造的,所以我需要用它做算术。如果你有一个简单的方法,请给我解释一下,谢谢。如果你不使用3字节的算术是如何溢出的,那么坚持下去是没有意义的。您只需在函数中使用
int
(又称
int4
,它有4个字节和适当的算术)并在完成时截断其值。可能是跟你。