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é.