2017-01-13 2 views
0

Je procédure stockée dans Postgres avec une variable commeSomme bytea dans Postgres

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

totLen doit être exactement 3 octets un je dois résumer autre valeur comme

totLen = totLen + 1; 

J'essaie totLen = totLen + E '\ x01' mais ne fonctionne pas. Quelle est la bonne solution?

+0

Qu'est-ce que vous essayez d'atteindre? Pourquoi la longueur d'une variable PL/pgSQL est-elle importante pour vous? –

+0

Ce n'est pas le point, mais vous voulez savoir que j'écris le message BUFR (https://en.wikipedia.org/wiki/BUFR). –

+0

La question demeure: pourquoi vous souciez-vous de la longueur d'une * variable *? Vous ne pouvez pas faire d'arithmétique avec des valeurs 'bytea'. Vous pouvez très probablement réaliser ce que vous voulez faire d'une manière beaucoup plus simple. Si seulement vous partagiez la grande image de ce que vous essayez de faire. –

Répondre

0

Ceci est une fonction qui traite les trois octets de l'offset offs de la valeur byteab comme entier big-endian trois octets et ajoute i à ce numéro:

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;$$;