bonjour
Débutant en pl/sql j'ai ce petit pronbleme de fonction à vous soumettre:
Une table contient des lignes dont je veux recopier certaines en fonction de 2 critéres : select copy_semaine(2009, 42, 2010, 43)
Le but est de dupliquer si il n'existent pas les enregistrement de (semaine=42et année=2009) en changeant l'année 2009 en 2010 et la semaine 42 en 43
Ainsi si j'ai
2009 42 toto
2008 41 titi
j'aurais aprés l'execution de select copy_semaine(2009, 42, 2010, 43)
2009 42 toto
2008 41 titi
2010 43 toto

- Si j'execute la fonction pas à pas x fois je n'ai pas de doublon
- Si je lance deux fois select copy_semaine(2009, 42, 2010, 43)
j'ai toutes mes lignes en double

/* CODE DE 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
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
CREATE OR REPLACE FUNCTION "public"."copy_semaine" (annee1 integer, semaine1 integer, annee2 integer, semaine2 integer) RETURNS boolean AS
$body$
DECLARE
annee_in alias for $1;
semaine_in alias for $2;
annee_out alias for $3;
semaine_out alias for $4;
--
xnom_societe text;
xnom_interimaire text;
xprenom_interimaire text;
xstatus_mission text;
xnom_atelier text;
xjour_arrivee text;
xcode_prestataire text;
nbrec integer;
 
--
cOrigine CURSOR (cAnnee integer, cSemaine integer) IS 
	SELECT nom_societe, nom_interimaire, prenom_interimaire, 
                        status_mission, nom_atelier, jour_arrivee, code_prestataire 
             FROM interim_feuille
             WHERE annee = cAnnee
             AND numero_semaine = cSemaine
            AND status_mission = 'MC';  
 
BEGIN
   OPEN cOrigine(annee_in, semaine_in);                        
   FETCH cOrigine INTO xnom_societe, xnom_interimaire, xprenom_interimaire, xstatus_mission, xnom_atelier, xjour_arrivee, xcode_prestataire;
 
   WHILE FOUND LOOP         
 
        select into nbrec count(*) from interim_feuille
        where nom_societe = xnom_societe
        and nom_interimaire = xnom_interimaire
        and prenom_interimaire = xprenom_interimaire
        and annee = annee_out
        and numero_semaine = semaine_out;
 
        if nbrec = 0 then
 
   			insert into interim_feuille
        	(nom_societe, numero_semaine, nom_interimaire, prenom_interimaire, status_mission,
         	 nom_atelier, jour_arrivee, code_prestataire, annee)
        	values
        	(xnom_societe, semaine_out, xnom_interimaire, xprenom_interimaire, xstatus_mission, 
         	xnom_atelier, xjour_arrivee, xcode_prestataire, annee_out);
 
        end if;
 
   		FETCH cOrigine INTO xnom_societe, xnom_interimaire, xprenom_interimaire, xstatus_mission, xnom_atelier, xjour_arrivee, xcode_prestataire;
 
   END LOOP;
 
   RETURN true;
 
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER