Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/02/2006, 11h01   #1
Invité de passage
 
Inscription : février 2006
Messages : 5
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 5
Points : 0
Points : 0
Par défaut Probleme ALTER Puis UPDATE

BONJOUR a tous ,

J'aimerai un peut d'aide car je seche sur un probleme postgres 8.1.

J'aimerai pouvoir UPDATER des champs mais voila avant je les testes pour voir si ils sont deja crée.
Le Cas Echeant je fait un Alter table.

Cela fonctionne mais .. 1 fois sur 2 ???
J'ai essayer d'isoler le probleme en decoupant la fonction en 2 Afin de s'assurer que L'update se fait bien apres l'ALTER.
Mais cela ne fonctionne toujours pas.
Voici Le code
Code :
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
CREATE OR REPLACE FUNCTION ifc_session_write("varchar", "varchar", "varchar")
  RETURNS bool AS
$BODY$DECLARE
	v_session_id ALIAS FOR $1;
	v_column_name ALIAS FOR $2;
	v_value ALIAS FOR $3;
BEGIN
	-- Si la session existe bien
	IF EXISTS(SELECT session_id FROM ifc_session WHERE session_id = v_session_id) THEN 
 
		-- Si la colonne correspondant à variable de session n'existe pas encore,
		IF NOT EXISTS(SELECT table_name, column_name FROM information_schema.COLUMNS WHERE table_name = 'ifc_session' AND column_name = v_column_name) THEN
 
			-- On crée la colonne
			EXECUTE 'ALTER TABLE ifc_session ADD COLUMN ' || quote_ident(v_column_name) || ' varchar(255);';
			EXECUTE 'ALTER TABLE ifc_session ALTER COLUMN ' ||  quote_ident(v_column_name) || ' SET STORAGE EXTENDED;';
		END IF;
 
		-- Enregistrement de la valeur de la variable dans la base
		EXECUTE 'UPDATE ifc_session SET ' || quote_ident(v_column_name) || ' = ' || quote_literal(v_value) || ' WHERE session_id = ' || quote_literal(v_session_id) || ';';
 
		-- Mise à jour de la date de dernière modification
		UPDATE ifc_session SET last_access = CURRENT_TIMESTAMP WHERE session_id = v_session_id;
 
		RETURN TRUE;
	ELSE
		-- La session n'existe pas
		RETURN FALSE;
	END IF;
END;$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION ifc_session_write("varchar", "varchar", "varchar") OWNER TO "admin";
COMMENT ON FUNCTION ifc_session_write("varchar", "varchar", "varchar") IS 'Ecrit la valeur d''une variable dans la session. Paramètre : identifiant de la session - nom de la variable - valeur de la variable.';
quelqu'un a une idée???
juan75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2006, 11h28   #2
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
Bonjour,

je ne vois pas trop ce qui provoque ce comportement, peut-être un problème subtile de transaction, par contre je suis certain que la méthode n'est pas la bonne. Les commandes DDL (Data Definition Language) qui créent ou modifient des objets du SGBDR doivent en mode production se limiter à la création de table temporaires durant le temps de la session, ou à la limite à la regénération d'indexes pour des opérations de maintenance.

Je prendrais le problème différemment ; je créerais une tables variables_session, qui contiendrait les champs column_name et v_value, et une clé étrangère vers la table ifc_session. L'écriture de ta procédure stockée devient alors triviale.
__________________
FAQ XML
------------
« Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
Giacomo Leopardi
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2006, 12h31   #3
Invité de passage
 
Inscription : février 2006
Messages : 5
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 5
Points : 0
Points : 0
Par défaut Merci

Merci Beaucoup de ta reponse.
Tu as raison c'est ce que je vais faire.
juan75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2006, 12h41   #4
Invité de passage
 
Inscription : février 2006
Messages : 5
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 5
Points : 0
Points : 0
Par défaut Solution

-- Function: ifc_session_write("varchar", "varchar", "varchar")

-- DROP FUNCTION ifc_session_write("varchar", "varchar", "varchar");

CREATE OR REPLACE FUNCTION ifc_session_write("varchar", "varchar", "varchar")
RETURNS bool AS
$BODY$DECLARE
v_session_id ALIAS FOR $1;
v_name ALIAS FOR $2;
v_value ALIAS FOR $3;
BEGIN
-- Si la session existe bien
IF EXISTS(SELECT session_id FROM ifc_session WHERE session_id = v_session_id) THEN

-- Si la variable existe déjà pour cette session,
IF EXISTS(SELECT session_id, name FROM ifc_variable WHERE session_id = v_session_id AND name = v_name) THEN

-- On met à jour la valeur de la variable
UPDATE ifc_variable SET value = v_value WHERE session_id = v_session_id AND name = v_name;

-- Si la variable n'existe pas pour cette session
ELSE
-- On crée la variable
INSERT INTO ifc_variable (session_id, name, value) VALUES (v_session_id, v_name, v_value);
END IF;

-- Mise à jour de la date de dernière modification
UPDATE ifc_session SET last_access = CURRENT_TIMESTAMP WHERE session_id = v_session_id;

RETURN TRUE;
ELSE
-- La session n'existe pas
RETURN FALSE;
END IF;
END;$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION ifc_session_write("varchar", "varchar", "varchar") OWNER TO "admin";

Et je crée au prealable 2 tables liés.

Merci encore.
juan75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h52.


 
 
 
 
Partenaires

Hébergement Web