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 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.

wink

Tawfik

A+


Cordiales Salutations

Hors ligne

Pied de page des forums