Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 15/10/2009 09:21:42
- philippe.pasquali
- Membre
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
- herve.lefebvre
- Membre
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
- philippe.pasquali
- Membre
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
Pages : 1