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:
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:
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:
POS := REGEXP_INSTR(a.libellestatut::text, text '[0-9]{8}');
Mais j'obtiens le message suivant lors de l'exécution :
Code:
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é.