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 :

Problème variable toujours à 0 après fonction instr ou position [9.1]


Sujet :

Requêtes PostgreSQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2015
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Problème variable toujours à 0 après fonction instr ou position
    Bonjour,

    Je viens sur ce forum aujourd'hui pour vous faire part d'un petit souci.
    J'ai écrit une fonction sous pgAdmin 1.14 qui permet d'aller récupérer dans une colonne varchar(1024), chercher la position d'une expression régulière (date sous la forme AAAAMMJJ), puis d'insérer cette date dans une colonne dateStatut11 ou dateStatut12 qui sont au format timestamp.

    Voici la fonction :
    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
    CREATE OR REPLACE FUNCTION rattrapage_dateStatut() RETURNS SETOF titrealpha AS $BODY$
    DECLARE 
    	POS integer;
    	a titrealpha%rowtype;
    	b titrebinaire%rowtype;	
     
    BEGIN
    	FOR a IN SELECT * FROM titrealpha ta
    	    WHERE codestatut = '11' and id_titrealpha < 500000 LOOP
    		POS := position('[0-9]{8}' in a.libellestatut::text);
    	        update titrealpha set dateStatut11 = date(concat(substr(a.libellestatut::text , POS + 4, 4), substr(a.libellestatut::text , POS + 2, 2), substr(a.libellestatut::text , POS, 2)));
    	        RETURN NEXT a; -- return current row of SELECT
    	END LOOP;
     
    	FOR a IN SELECT * FROM titrealpha ta 
    	    WHERE codestatut = '12' and id_titrealpha < 500000 LOOP
    		POS := position('[0-9]{8}' in a.libellestatut::text);
    		update titrealpha set dateStatut12 = date(concat(substr(a.libellestatut::text , POS + 4, 4), substr(a.libellestatut::text , POS + 2, 2), substr(a.libellestatut::text , POS, 2)));
    		POS := position('[0-9]{8}' in substr(ta.libellestatut::text, POS));
    		update titrealpha set dateStatut11 = date(concat(substr(a.libellestatut::text , POS + 4, 4), substr(a.libellestatut::text , POS + 2, 2), substr(a.libellestatut::text , POS, 2)));
    		RETURN NEXT a; -- return current row of SELECT
            END LOOP;
     
    	RETURN;
    END;
    $BODY$
    LANGUAGE plpgsql
    J'ai le message d'erreur suivant lors de l'exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    syntaxe en entrée invalide pour le type date : « E CHATD ».
    À noter que la valeur présente dans la colonne est la suivante : "DATE CHANGEMENT DE STATUT : 05062014", c'est comme si la variable POS était toujours égale à 0 après la fonction position().
    J'ai essayé de faire la même fonction avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    POS := REGEXP_INSTR(a.libellestatut::text, text '[0-9]{8}');
    Mais j'obtiens le message suivant lors de l'exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ERREUR:  la fonction regexp_instr(text, text) n'existe pas
    LINE 1: SELECT REGEXP_INSTR(a.libellestatut::text, '[0-9]{8}')
                   ^
    HINT:  Aucune fonction ne correspond au nom donné et aux types d'arguments.
    Vous devez ajouter des conversions explicites de type.

    Pourriez-vous m'aider à trouver pourquoi l'une et l'autre de ces fonctions ne fonctionnent pas?
    Merci d'avance à la communauté.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 766
    Points : 52 563
    Points
    52 563
    Billets dans le blog
    5
    Par défaut
    Les fonctions PG ont des signatures par rapport aux types. text est un type. varchar ou char en est un autre.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2015
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Oui mais je ne comprends pas pourquoi la variable POS serait égale à 0. Et suivant la documentation postgres la fonction regexp_instr peut accepter du varchar dans ses arguments et quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    REGEXP_INSTR(a.libellestatut, varchar '[0-9]{8}');
    ça ne fonctionne pas non plus.

  4. #4
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2015
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    J'ai contourné le problème en utilisant un substring de mon expression régulière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DATECHGMT := substring(a.libellestatut::text, '[0-9]{8}');
    POS := position(DATECHGMT in a.libellestatut::text) + 8;  --> le +8 est la pour récupérer la prochaine date dans la string.
    Je passe le topic en résolu.

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

Discussions similaires

  1. [XL-2010] Problème avec la fonction InStr
    Par phil_qc dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 02/09/2014, 18h50
  2. Problème de variable fantôme dans une fonction de callback
    Par kyfr59 dans le forum ActionScript 3
    Réponses: 6
    Dernier message: 23/03/2011, 11h35
  3. problème variable extern
    Par HeKaz dans le forum C
    Réponses: 14
    Dernier message: 08/01/2003, 01h44

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