PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 20/08/2018 21:55:50

trainvapeur
Membre

initialisation d'un tableau avec des constantes en hexadecimal

Bonsoir,

je voudrais initialiser un tableau avec les 32 premières puissances de 2. Si je ne prend que les 3 premières, je peux écrire :

ctableau constant integer ARRAY[3] := '{1, 2, 4}';

Cela fonctionne. Mais cela devient un peu compliqué avec les grandes valeurs et pour être plus lisible, je voudrais écrire les constantes en hexadécimal. Quelquechose comme :
ctableau constant integer ARRAY[3] := '{X'00000001', X'00000002', X'00000004'}';

Je crois avoir essayé toutes les écritures possibles mais soit j'ai une erreur de syntaxe soit c'est à l'execution que j'ai une erreur.

Est-ce que vous auriez une idée ?

Par contre, la déclaration d'une variable simple fonctionne :
toto constant integer := X'00000004';

Merci d'avance !
Jean à Grenoble

Hors ligne

#2 21/08/2018 21:57:21

Marc Cousin
Membre

Re : initialisation d'un tableau avec des constantes en hexadecimal

C'est plus simple, je trouve, avec la syntaxe ARRAY[], dans ce cas là:

ARRAY[X'00000001', X'00000002', X'00000004'];

Sinon vous pouvez initialiser la variable avec une fonction, par exemple:

create or replace function genere_array () returns int[] language plpgsql as
$$
declare i int;
declare ctableau int[]:= array[]::int[];
begin
  for i in 0..31 loop
          ctableau := ctableau || (1<<i);
  end loop;
  return ctableau;
end
$$
;

Marc.

Hors ligne

#3 22/08/2018 10:28:51

trainvapeur
Membre

Re : initialisation d'un tableau avec des constantes en hexadecimal

Bonjour Marc,

avec la syntaxe
  ctableau constant int[3]:= array[X'00000001', X'00000002', X'0000000F']::int[];
tout fonctionne !

Cela m'a permis de 'résoudre' un autre 'bug' ailleurs : si j'affiche les valeurs de ctableau dans un RAISE NOTICE, j'obtiens bien 1,  2 et 15. Mais si j'enlève le ::int[] à la fin de la ligne, le même RAISE donne 1, 10,  1111 ce qui représente  la chaine de bit mais dans un nombre entier !! Si j'affiche 2 * ctableau[3], j'obtiens 2222 !!!!

Merci beaucoup pour ton aide.
Jean à Grenoble

Hors ligne

Pied de page des forums