Bonjour,

Je suis dans la version 8.4 de PostgreSQL.
J'ai les tables suivantes :


J'ai créé une fonction en PL nommé func_saisieHeure.
Voilà en gros le résultat attendu de cette fonction :

Ce tableau est une table temporaire créée par la fonction. C'est plus une procédure vu qu'elle ne renvoie rien.

Voici le code de ma 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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
create or replace function func_SaisieHeure (vUserId int4, t_deb_sem int4, t_fin_sem int4) returns void as $$
declare
	referrer_id_tache RECORD;
	referrer_timestamp record;
	vDate timestamp with time zone;
	vDay int4;
	vRow int4;
	-- curseur qui récupère tous les id des taches sur lesquelles la ressource à travailler
	cId_tache cursor (id int4) is
			select id_tache
			from a_travaille
			where id_tache in (SELECT id_tache
							   FROM a_travaille
							   WHERE id_ressource= id);
 
	-- curseur récupérant des heures en fonction d'un timestamp, d'une tache et pour une semaine donnée
	cT cursor (tm_deb_sem int4, tm_fin_sem int4, id_tache_param int4) is 
		select jour_travaille,  id_type_champ_saisie
		from a_travaille
		where id_tache = id_tache_param
		and atr.jour_travaille > tm_deb_sem
		and atr.jour_travaille < tm_fin_sem;
begin
-- création de la table temporaire contenant les informations nécessaires pour la saisie des heures
	drop table if exists tab_temp_welcome_hours;
	create global temporary table tab_temp_welcome_hours as
		SELECT t.id_tache, t.description_tache, typ.label_type_tache, p.nom_projet, t.date_deb_tache, t.date_fin_tache, t.duree_limite 
															FROM tache t
															join type_tache typ on typ.id_type_tache = t.id_type_tache
															join projet p on p.id_projet = t.id_projet
															WHERE t.id_tache IN (SELECT id_tache
																			   FROM a_travaille
																			   WHERE id_ressource= vUserId);
	-- ajout des colonnes correspondant aux jours
	alter table tab_temp_welcome_hours
		add column Lundi varchar(10);
	alter table tab_temp_welcome_hours
		add column Mardi varchar(10);
	alter table tab_temp_welcome_hours
		add column Mercredi varchar(10);
	alter table tab_temp_welcome_hours
		add column Jeudi varchar(10);
	alter table tab_temp_welcome_hours
		add column Vendredi varchar(10);
	alter table tab_temp_welcome_hours
		add column Samedi varchar(10);
 
	for referrer_id_tache in cId_tache (vUserId) LOOP
		for referrer_timestamp in cT (t_deb_sem, t_fin_sem, referrer_id_tache) LOOP
			-- récupère le timestamp format Unix epoch pour le convertir en timestamp with time zone pour pouvoir utiliser la fonction extract
			select to_timestamp(referrer_timestamp.jour_travaille)
			into vDate;
			-- extrait le nombre du jour de la date fourni en argument sachant que 0 est un dimanche et 6 un samedi
			select extract(dow from timestamp ''||vDate||'')
			into vDay;
 
			if(vDay = 1) then
				insert into tab_temp_welcome_hours (Lundi) values (referrer_timestamp.id_type_champ_saisie);
			end if;
 
			if(vDay = 2) then
				insert into tab_temp_welcome_hours (Mardi) values (referrer_timestamp.id_type_champ_saisie);
			end if;
 
			if(vDay = 3) then
				insert into tab_temp_welcome_hours (Mercredi) values (referrer_timestamp.id_type_champ_saisie);
			end if;
 
			if(vDay = 4) then
				insert into tab_temp_welcome_hours (Jeudi) values (referrer_timestamp.id_type_champ_saisie);
			end if;
 
			if(vDay = 5) then
				insert into tab_temp_welcome_hours (Vendredi) values (referrer_timestamp.id_type_champ_saisie);
			end if;
 
			if(vDay = 6) then
				insert into tab_temp_welcome_hours (Samedi) values (referrer_timestamp.id_type_champ_saisie);
			end if;
 
			GET DIAGNOSTICS vRow = ROW_COUNT;
 
			if vRow > 0 then
				commit;
			else
				RAISE EXCEPTION 'problème au niveau des insert, vérifiez les tables, colonnes etc';
			end if;
		end loop;
	end loop;
end;
 
$$ LANGUAGE plpgsql;
Elle reçoit en paramètre l'id du user connecté, le timestamp du début de la semaine et le timestamp de la fin de semaine.
Elle se créé sans aucun problème dans PgAdmin III mais c'est lors du test de la fonction que ça plante.
J'utilise la requête :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
select * from func_SaisieHeure(1, 1262559999, 1263159999);
J'ai inséré des taches dans la base, pour le test, dont les timestamps coïncident avec le début et la fin de la semaine
Voici l'erreur que me renvoit Pg :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
NOTICE:  la table « tab_temp_welcome_hours » n'existe pas, poursuite du traitement
CONTEXT:  instruction SQL « drop table if exists tab_temp_welcome_hours »
PL/pgSQL function "func_saisieheure" line 24 at instruction SQL
ERREUR:  syntaxe en entrée invalide pour l'entier : « (1) »
CONTEXT:  PL/pgSQL function "func_saisieheure" line 48 at FOR sur un curseur
 
********** Erreur **********
 
ERREUR: syntaxe en entrée invalide pour l'entier : « (1) »
État SQL :22P02
Contexte : PL/pgSQL function "func_saisieheure" line 48 at FOR sur un curseur
Je ne comprends pas cette erreur étant donné que la ligne concernée est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
for referrer_id_tache in cId_tache (vUserId) LOOP
Le type du paramètre est correct (int4) que ce soit dans le param' d'entrée de la fonction, dans la déclaration du curseur ou dans son appel.

SI quelqu'un connait le pourquoi du comment, votre aide me sera précieuse .
Merci d'avance.

Cordialement,

Nargonath.

P.S : Si vous constatez une erreur dans les différents insert, j'ai hésité à le faire en requête dynamique, je voudrais voir si ça marche de la façon dont je l'ai codé.