IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

Aide sur fonction psql


Sujet :

Requêtes PostgreSQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2018
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Aide sur fonction psql
    Bonjour,

    je dois convertir une fonction existante sous Oracle vers Postgres 10. Le souci 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.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    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 ">"

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Le souci se situe au niveau de la variable "Offset" (mot réservé ?). En le remplaçant par autre chose ça le fait.

    Code pl/sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    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;
    	end if;
     
       	if xOffset < 0 then
    		xOffset=range+offs;
    	end if;
    	xOffset=xOffset+minVal;
    	return xOffset+minVal;
    end; $$ language plpgsql immutable;

    En dehors des instruction écrites en minuscules (tellement plus agréable) et de l'indentation (tellement plus lisible) il restait un souci sur l'instruction Offset:=range+offset; (variable "offset" qui n'existe pas). J'ai présumé qu'il s'agissait du paramètre "offs".
    Quant à l'utilité du premier test...

    PS: le mot "immutable" en fin de code signifie que ta fonction ne modifie rien en base. Ca aide le moteur à optimiser le truc.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2018
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    super merci cela fonctionne par contre lorsque j'appelle la fonction dans une autre fonction j'ai un problème d'encodage.
    La base est en UTF8.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    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'
    concernant la premiere condition j'ai oublié une partie du code et le return n'étais pas bon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    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;
    select decrypt('H(v,*0y2.','PREV');
    ERROR: requested character too large for encoding: -8

    normalement je devrais retrouver cette valeur : R01048468

    Cordialement.
    Laurent.

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Chez-moi, ça fonctionne bien
    Nom : VirtualBox_Debian8_64b_11_07_2018_00_22_00.png
Affichages : 80
Taille : 324,3 Ko

    Et le contenu de "a" qui contient tes fonctions juste un peu optimisées question calculs ("j" et "k" ne servent à rien et "newcode" et "offs" pourraient sauter eux aussi)
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    create or replace function decrypt (in s_in varchar, in s_key varchar) returns varchar as $$
    declare
    	lkey int;
    	ls int;
    	i int;
    	offs int;
    	newcode int;
    	resultat varchar;
    begin
            resultat:='';
            lkey:=length(s_key);
            ls:=length(s_in);
     
            for i in 1..ls
            loop
                    offs:=ascii(substr(s_key,(i-1)%lkey + 1,1));
                    newcode:=test(ascii(substr(s_in,i,1)),-offs,32,121);
                    resultat:=resultat||chr(newcode);
            end loop;
     
            return resultat;
    end;$$ language 'plpgsql' immutable;
     
    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) % range;
     
       	if xOffset < 0 then
    		xOffset=range+xOffset;
    	end if;
     
    	return xOffset+minVal;
    end; $$ language plpgsql immutable;

    Je pense que ton encodage bdd n'est peut-être pas vraiment utf8. J'ai tenté de tester avec des bases encodées différemment mais mon système ne veut pas les créer à cause de ma locale qui est utf8.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2018
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    ok tout fonctionne après avoir refait la base sans utilisé le template0.
    Merci de ton aide et pour les optimisations du code.

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par snegues Voir le message
    ok tout fonctionne après avoir refait la base sans utilisé le template0.
    Ce n'est pas le template0 qui pose souci car ça fonctionne aussi avec...
    Nom : VirtualBox_Debian8_64b_11_07_2018_00_22_00.png
Affichages : 69
Taille : 284,7 Ko

    Citation Envoyé par snegues Voir le message
    Merci de ton aide et pour les optimisations du code.
    Avec plaisir (première fois que mes faibles connaissances SQL permettent d'aider quelqu'un dans cette rubrique ) Pense à cliquer sur "résolu" pour les stats du forum...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Macro] Aide sur fonction eval
    Par bibette dans le forum Macro
    Réponses: 1
    Dernier message: 09/07/2008, 07h54
  2. Aide sur fonction set et handles
    Par occor dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 23/03/2007, 19h17
  3. [AJAX] aide sur fonction ajax navigation
    Par speedylol dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 13/11/2006, 14h17
  4. [MySQL] besoin d'aide sur fonctions WHERE LIKE
    Par rvm31 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 24/08/2006, 21h37
  5. besoin d'aide sur fonction curseur et procedure
    Par abdel54 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/11/2005, 18h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo