2017-01-13 7 views
0

Я хранимую процедуру в Postgres с переменной какСумма BYTEA в Postgres

DECLARE 
    totLen BYTEA; 
BEGIN 
    totLen = E'\\x000034'; 
    .... 

totLen должно быть ровно 3 байта я должен суммировать другое значение, как

totLen = totLen + 1; 

Стараюсь totLen = totLen + E '\ x01', но не работает. Какое правильное решение?

+0

Что вы пытаетесь достичь? Почему для переменной важна длина переменной PL/pgSQL? –

+0

Это не главное, но вы хотите знать, что я пишу BUFR (https://en.wikipedia.org/wiki/BUFR) сообщение. –

+0

Остается вопрос: почему вы заботитесь о длине переменной *? Вы не можете выполнять арифметику с значениями 'bytea'. Вы, скорее всего, достигнете того, что хотите сделать намного проще. Если бы вы разделили общую картину того, что вы пытаетесь сделать. –

ответ

0

Это функция, которая обрабатывает три байта от смещения offs от bytea значения b в три-байтового большой обратный порядок байт целое и добавляет 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;$$; 

 Смежные вопросы

  • Нет связанных вопросов^_^