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 07/07/2018 01:19:40

Sneg
Membre

erreur sur condition if potsgres 10

Bonjour,

je dois convertir une fonction existante sous oracle vers postgres 10. Le soucis est qu'il me sort une erreur au niveau du IF si quelqu'un a une idée sur le problème parce que la je sèche.

CREATE OR REPLACE FUNCTION test (val IN int, offs IN
int, minVal IN int, maxVal IN int) RETURNS INT AS
$$
DECLARE
Offset int;
newOffset int;
newVal int;
range int;
BEGIN
range:=maxval-minval+1;
newOffset:=(offs/abs(offs))*(abs(offs) % range);
newVal:=val-minVal;

Offset:=newVal+newOffset;

if Offset > range then
Offset:=Offset;
end if;

if Offset<0 then
Offset:=range+offset;
end if;
Offset:=Offset+minVal;
return Offset+minVal;

END;
$$ LANGUAGE plpgsql;

ERROR: syntax error at or near ">"

Hors ligne

#2 07/07/2018 09:03:45

jmarsac
Membre

Re : erreur sur condition if potsgres 10

Bonjour,

OFFSET est un mot réservé, vous pouvez renommer la variable en v_offset (par exemple).

Hors ligne

#3 07/07/2018 09:06:07

rjuju
Administrateur

Re : erreur sur condition if potsgres 10

Bonjour,


OFFSET est un mot clé réservé.  Il faut soit utiliser un autre nom de variable, soit l'entourer de guillemets doubles (et dans ce cas faire attention à la casse dans le nom de la variable, par exemple la casse n'est pas bonne dans l'instruction du 2ème IF).

Hors ligne

#4 10/07/2018 21:14:01

Sneg
Membre

Re : erreur sur condition if potsgres 10

Bonjour,

super merci ça fonctionne par contre j'ai une erreur lorsque je fais appel a cette fonction dans une autre fonction sur l'encodage, une idée sur cette erreur ?
La base est en UTF8.

fonction decrypt

CREATE FUNCTION decrypt (in s_in varchar, in s_key varchar) RETURNS varchar AS
$$
DECLARE LKEY INT;
LS INT;
I  INT;
J  INT;
K  INT;
OFFS  INT;
NEWCODE INT;
RESULTAT VARCHAR;
BEGIN
        RESULTAT:='';
        LKEY:=LENGTH(S_KEY);
        LS:=LENGTH(S_IN);
        K:=1;

        FOR I IN 1..LS
        LOOP
                OFFS:=ASCII(SUBSTR(S_KEY,K,1));
                NEWCODE:=test(ASCII(SUBSTR(S_IN,I,1)),-OFFS,32,121);
                RESULTAT:=RESULTAT||CHR(NEWCODE);
                K:=K+1;
                IF  K>LKEY  then
                        K:=1;
                END IF;
        END LOOP;

        RETURN RESULTAT;
END;
$$
LANGUAGE 'plpgsql'


select decrypt('H(u.()u3-','PREV')
ERROR: requested character too large for encoding: -8

Hors ligne

#5 10/07/2018 21:43:41

gleu
Administrateur

Re : erreur sur condition if potsgres 10

J'ai essayé de le rejouer et il m'indique (avec raison) que je n'ai pas la fonction test.


Guillaume.

Hors ligne

#6 10/07/2018 22:57:48

Sneg
Membre

Re : erreur sur condition if potsgres 10

Bonjour,

est ce que tu as pris la 1ere fonction du 1er message ?

Cordialement.
Laurent.

Hors ligne

#7 10/07/2018 23:05:20

Sneg
Membre

Re : erreur sur condition if potsgres 10

fonction test:

create or replace function test (val in int, offs in int, minVal in int, maxVal in int) returns int as $$
declare
    xOffset integer;
    newOffset integer;
    newVal integer;
    range integer;
begin
    range=maxval-minval+1;
    newOffset=(offs/abs(offs))*(abs(offs) % range);
    newVal=val-minVal;

    xOffset=newVal+newOffset;

    if xOffset > range then
        xOffset=xOffset % range;
    end if;

       if xOffset < 0 then
        xOffset=range+xOffset;
    end if;

    return xOffset+minVal;
end; $$ language plpgsql immutable;

fonction decrypt:

create function decrypt (in s_in varchar, in s_key varchar) returns varchar as $$
declare lkey int;
ls int;
i int;
j int;
k int;
offs int;
newcode int;
resultat varchar;

begin
        resultat:='';
        lkey:=length(s_key);
        ls:=length(s_in);
        k:=1;

        for i in 1..ls
        loop
                offs:=ascii(substr(s_key,k,1));
                newcode:=test(ascii(substr(s_in,i,1)),-offs,32,121);
                resultat:=resultat||chr(newcode);
                k:=k+1;
                if  k>lkey then
                        k:=1;
                end if;
        end loop;

        return resultat;
end;$$ LANGUAGE 'plpgsql'

Hors ligne

#8 11/07/2018 02:18:47

Sneg
Membre

Re : erreur sur condition if potsgres 10

Bonjour,

problème résolu après avoir créé la base sans passer par le template0.

Hors ligne

Pied de page des forums