Postgresql 博士后补习
我在postgres中有一个带有如下变量的存储过程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
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个字节和适当的算术)并在完成时截断其值。可能是跟你。