Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 22/11/2011 13:27:00
- NOURI
- Membre
Fonction pgSQL
Bonjour à tous,
Encore une fois j'ai besoin de l'aide.
Voici la contexte :
j'ai une table interventions
CREATE TABLE interventions
(
id_intervention bigserial NOT NULL,
code character varying(300) NOT NULL,
id_gamme bigint NOT NULL
)
WITH (
OIDS=FALSE
);
ALTER TABLE interventions OWNER TO postgres;
et une autre table gammes_preventives
CREATE TABLE gammes_preventives
(
id_gamme bigserial NOT NULL,
id_famille bigint NOT NULL,
gamme character varying(200) NOT NULL,
designation character varying(300),
frequence character varying(100)
)
WITH (
OIDS=FALSE
);
ALTER TABLE gammes_preventives OWNER TO postgres;
et une table actions_gammes
CREATE TABLE actions_gammes
(
id_action_gamme bigserial NOT NULL,
id_gamme bigint NOT NULL,
action_gamme character varying(9000) NOT NULL,
commentaire character varying(9000)
)
WITH (
OIDS=FALSE
);
ALTER TABLE actions_gammes OWNER TO postgres;
et finalement une table suivi_actions_gammes_preventives
CREATE TABLE suivi_actions_gammes_preventives
(
id_suivi_action_gamme bigserial NOT NULL,
id_intervention bigint NOT NULL,
id_action_gamme bigint NOT NULL,
statut character varying(50)
)
WITH (
OIDS=FALSE
);
ALTER TABLE suivi_actions_gammes_preventives OWNER TO postgres;
Je voudrais savoir comment faire pour copier la liste des actions (id_action_gamme) ... de la table actions_gammes dans la table suivi_actions_gammes_preventives, En passant par la TABLE interventions (id_intervention)
Pouvez-vous m'aider SVP ?
Merci d'avance
Dernière modification par NOURI (22/11/2011 13:29:46)
Cordiales Salutations
Hors ligne
#2 23/11/2011 13:00:19
- Marc Cousin
- Membre
Re : Fonction pgSQL
«Copier» ? Pouvez-vous expliquer ce que vous entendez par là ?
Marc.
Hors ligne
#3 23/11/2011 14:55:25
- NOURI
- Membre
Re : Fonction pgSQL
Bonjour Marc,
En effet je voudrais insérer les data (id_action_gamme) de la table actions_gammes dans la table suivi_actions_gammes_preventives
Voici mon code que manque la partie en question
CREATE OR REPLACE FUNCTION creation_actions_preventives(code_intervention character varying, code_gamme character varying, usergmao character varying)
RETURNS bigint AS
$BODY$
DECLARE
v_nb integer;-- nombre
ret bigint := 0; -- variable de retour
gmao_id_intervention bigint; -- id de l'intervention
gmao_id_gamme bigint; -- id de la gamme
gmao_nb_action_gamme bigint; -- nombre des actions pour une gamme
/* gestion de la valeur de retour :
>0 : retour
-1 : le code intervention n'existe pas
-2 : le code gamme n'existe pas
-3 : pas d'action pour cette gamme
*/
BEGIN
-- Récupération id_intervention
select id_intervention into gmao_id_intervention from interventions where code = code_intervention limit 1;
GET DIAGNOSTICS v_nb := ROW_COUNT;
if v_nb=0 then
ret := -1;
return ret;
end if;
-- Récupération id_gamme
select id_gamme into gmao_id_gamme from gammes_preventives where gamme = code_gamme limit 1;
GET DIAGNOSTICS v_nb := ROW_COUNT;
if v_nb=0 then
ret := -2;
return ret;
end if;
-- Calcule nombre des action pour une gamme
select count(id_action_gamme) into gmao_nb_action_gamme from actions_gammes where id_gamme = gmao_id_gamme;
if gmao_nb_action_gamme = 0 then
ret := -3;
return ret;
end if;
-- étape 1 création d'une table temp, et on mettre dans cette table la liste des id_action_gamme, gmao_id_intervention, pour une gamme x
-- etape 2 c'est insérer les data de la table temp dans la table suivi_actions_gammes_preventives
RETURN 0; -- Transfert actions OK
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION creation_actions_preventives(character varying, character varying, character varying) OWNER TO postgres;
Merci d'avance.
Cordiales Salutations
Hors ligne
#4 23/11/2011 15:02:28
- Marc Cousin
- Membre
Re : Fonction pgSQL
Un ordre SQL unique du genre 'INSERT INTO suivi_actions_gammes_preventives SELECT …' ne suffirait pas ?
Marc.
Hors ligne
#5 23/11/2011 16:26:41
- NOURI
- Membre
Re : Fonction pgSQL
Merci pour votre repense !
je viens de modifier mon code, ça fonction mais incorrectement, en fait la fonction transfert que un seul action avec id_action_gamme pas bonne.
cette partie ne pose pas de problème
(gmao_id_intervention,(select id_action_gamme from actions_gammes where id_gamme = gmao_id_gamme) ?
Comment faire pour inserer toutes les actions de la tables actions_gammes en passant par gmao_id_gamme ?
voici mon code
-- Function: creation_actions_preventives(character varying, character varying, character varying)
-- DROP FUNCTION creation_actions_preventives(character varying, character varying, character varying);
CREATE OR REPLACE FUNCTION creation_actions_preventives(code_intervention character varying, code_gamme character varying, usergmao character varying)
RETURNS bigint AS
$BODY$
DECLARE
v_nb integer;-- nombre
ret bigint := 0; -- variable de retour
gmao_id_intervention bigint; -- id de l'intervention
gmao_id_gamme bigint; -- id de la gamme
gmao_nb_action_gamme bigint; -- nombre des actions pour une gamme
/* gestion de la valeur de retour :
>0 : retour
-1 : le code intervention n'existe pas
-2 : le code gamme n'existe pas
-3 : pas d'action pour cette gamme
-3 : erreur transfert actins
*/
BEGIN
-- Récupération id_intervention
select id_intervention into gmao_id_intervention from interventions where code = code_intervention limit 1;
GET DIAGNOSTICS v_nb := ROW_COUNT;
if v_nb=0 then
ret := -1;
return ret;
end if;
-- Récupération id_gamme
select id_gamme into gmao_id_gamme from gammes_preventives where gamme = code_gamme limit 1;
GET DIAGNOSTICS v_nb := ROW_COUNT;
if v_nb=0 then
ret := -2;
return ret;
end if;
-- Calcule nombre des action pour une gamme
select count(id_action_gamme) into gmao_nb_action_gamme from actions_gammes where id_gamme = gmao_id_gamme;
if gmao_nb_action_gamme = 0 then
ret := -3;
return ret;
end if;
-- Creation d'une table temp, et on mettre dans cette table la liste des id_action_gamme pour une gamme x
insert into suivi_actions_gammes_preventives (id_intervention,id_action_gamme,statut,createur,datecreation,datemaj) values (gmao_id_intervention,(select id_action_gamme from actions_gammes where id_gamme = gmao_id_gamme),'0',usergmao,current_timestamp,current_timestamp);
GET DIAGNOSTICS v_nb := ROW_COUNT;
if v_nb=0 then
ret := -4;
return ret;
end if;
RETURN 0; -- Transfert actions de actions_gammes vers suivi actions_gammes ...
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION creation_actions_preventives(character varying, character varying, character varying) OWNER TO postgres;
Dernière modification par NOURI (23/11/2011 16:27:12)
Cordiales Salutations
Hors ligne
#6 25/11/2011 09:31:33
- gleu
- Administrateur
Re : Fonction pgSQL
cette partie ne pose pas de problème
(gmao_id_intervention,(select id_action_gamme from actions_gammes where id_gamme = gmao_id_gamme) ?
Il est clair que ça ne doit pas faire ce que vous voulez (ou ce que vous vous attendez à ce que ça fasse).
Comment faire pour inserer toutes les actions de la tables actions_gammes en passant par gmao_id_gamme ?
Pas sûr que ce soit exactement ce que vous voulez faire, mais si j'ai bien compris, j'enleverais le count(*) et remplacerais l'INSERT par cet INSERT :
insert into suivi_actions_gammes_preventives
(id_intervention,id_action_gamme,statut,createur,datecreation,datemaj)
select
gmao_id_intervention,
id_action_gamme,
'0',
usergmao,
current_timestamp,
current_timestamp
from actions_gammes
where id_gamme = gmao_id_gamme;
Ceci dit, je vois deux autres problèmes dans votre code :
* faire un LIMIT sans ORDER BY ne va pas donner un résultat prédictif
* donner des noms de colonnes à des noms de variables revient simplement à chercher les ennuis
Guillaume.
Hors ligne
#7 25/11/2011 10:12:10
- NOURI
- Membre
Re : Fonction pgSQL
Merci bien!
ça fonctionne parfaitement.
pour LIMIT 1 ==> il y a que une seule mvt pour chaque code_intervention.
encore une fois merci.
Tawfik
A+
Cordiales Salutations
Hors ligne
Pages : 1