PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 15/10/2009 09:21:42

Fonction avec comportement spécial

Bonjour
Débutant en pl/sql j'ai ce petit probleme de fonction à vous soumettre:
Une table contient des lignes dont je veux en recopier certaines en modifiant deux colonnes
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

Le truc c'est que si je lance l'execution de la fonction 2 fois elle ne doit pas me créer de doublon, hors :
- En mode "pas à pas" : pas de doublon ==> ok
- En mode "normal"     : j'ai toutes mes lignes en double ==> ko


/* CODE DE LA FONCTION */

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

Merci de votre aide...

Hors ligne

#2 15/10/2009 09:55:05

gleu
Administrateur

Re : Fonction avec comportement spécial

La seule possibilité que je vois pour l'instant est que nom_societe, xnom_societe, nom_interimaire, xnom_interimaire, prenom_interimaire ou xprenom_interimaire est NULL.


Guillaume.

Hors ligne

#3 15/10/2009 10:23:35

Re : Fonction avec comportement spécial

Je ne comprends pas bien le rôle du curseur...

Si j'ai compris ce que vous cherchez à faire, il doit suffire de faire (j'ai pas testé) :

INSERT INTO interim_feuille(nom_societe, numero_semaine, nom_interimaire, prenom_interimaire, status_mission,
nom_atelier, jour_arrivee, code_prestataire, annee)
SELECT x.nom_societe, semaine_out, x.nom_interimaire, x.prenom_interimaire, x.status_mission,
x.nom_atelier, x.jour_arrivee, x.code_prestataire, annee_out
FROM interim_feuille AS X
WHERE annee = annee_in
AND numero_semaine = semaine_in
AND status_mission = 'MC'
AND NOT EXISTS (SELECT 1 FROM  interim_feuille AS y WHERE y.annee = annee_out AND numero_semaine=semaine_out
AND x.nom_societe= y.nom_societe
AND x.nom_interimaire= y.nom_interimaire
AND x.status_mission= y.status_mission
AND x.nom_atelier=  y.nom_atelier );

Bon, j'ai pas testé, mais vous voyez l'idée ?

Hors ligne

#4 16/10/2009 08:53:47

Re : Fonction avec comportement spécial

Bonjour
Aprés une toute petite modif, votre version fonctionne en exécution ( ce qui est mieux que ma version) et là ou c'est bizard en mode debug (pas à pas) elle ne fonctionne pas (EMS doit avoir un probléme)...
Mais bon je clotûre la discution car elle fonctionne dans l'executable
Merci encore...

Hors ligne

Pied de page des forums