IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

Probleme ALTER Puis UPDATE


Sujet :

PostgreSQL

  1. #1
    Candidat au Club
    Inscrit en
    Février 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 5
    Points : 2
    Points
    2
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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???

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    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.

  3. #3
    Candidat au Club
    Inscrit en
    Février 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Merci
    Merci Beaucoup de ta reponse.
    Tu as raison c'est ce que je vais faire.

  4. #4
    Candidat au Club
    Inscrit en
    Février 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 5
    Points : 2
    Points
    2
    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.

Discussions similaires

  1. Probleme de requete UPDATE pour modifier de champs ds DBGRID
    Par cmoimeme dans le forum Bases de données
    Réponses: 26
    Dernier message: 06/12/2005, 12h56
  2. Probleme Alter - Changer le type d'un champ
    Par Yphon dans le forum Bases de données
    Réponses: 3
    Dernier message: 09/09/2005, 13h58
  3. Probleme avec l'update
    Par belabyad dans le forum ASP
    Réponses: 8
    Dernier message: 02/05/2005, 10h18
  4. Probleme alter table
    Par F.F. dans le forum Langage SQL
    Réponses: 7
    Dernier message: 24/02/2005, 15h57
  5. Probleme 'ALTER TABLE' et 'FOREIGN KEY'
    Par maahta dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 30/09/2003, 14h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo