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 :

Création de Table de taille fixe


Sujet :

PostgreSQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 85
    Points : 80
    Points
    80
    Par défaut Création de Table de taille fixe
    Salut tous!
    Je cherche à créer une table qui contiendrait un nombre maximal d'enregistrements. Lorsque ce nombre est atteint, à l'insertion suivante, il faudrait supprimer l'enregistrement le plus vieux et insérer le nouveau.

    Je vais essayer de faire ça avec des trigger (ou autre suivant ce que je trouverai), mais je voudrais savoir si il existe une méthode/fonction/commande déjà prévue pour ce fonctionnement en SQL/PostgreSQL.

    Merci pour vos suggestions.


  2. #2
    Membre éclairé
    Avatar de gerald2545
    Profil pro
    Inscrit en
    Février 2003
    Messages
    744
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 744
    Points : 773
    Points
    773
    Par défaut
    je pense que la solution du trigger est inévitable.....

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 85
    Points : 80
    Points
    80
    Par défaut
    Je me suis lancé dans les triggers, et la création de fonctions. Mais j'ai un soucis... comment passer un nom de table en argument de fonction? J'ai essayé le type name, le type text, mais ça n'est pas accepté!

    Quelqu'un sait-il comment passer un nom de table en argument d'une fonction?

  4. #4
    Membre éclairé
    Avatar de gerald2545
    Profil pro
    Inscrit en
    Février 2003
    Messages
    744
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 744
    Points : 773
    Points
    773
    Par défaut
    tu peux donner ton code STP et dire exactement ce que tu veux faire, ainsi que les messages d'erreur éventuels?
    si je comprends bien tu veux créer une seule fonction qui est appelée par des triggers posés sur différentes tables?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 85
    Points : 80
    Points
    80
    Par défaut

    J'ai fini ma fonction, ... je vais voir comment l'utiliser dans un(e) trigger. Si d'ailleurs vous avez quelques lignes à me suggérer pour accélérer mes recherches, tout est le bien venu.

    En attendant, voilà la fonction:

    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
     
    CREATE OR REPLACE FUNCTION fc_init_table(varchar) RETURNS INTEGER AS '
    DECLARE
    	query TEXT;
    	strTypOp TEXT;
    	valdate TIMESTAMP;
    	curseur REFCURSOR;
     
    BEGIN
     
    	query := ''SELECT date FROM '' || $1 || '' ORDER BY date LIMIT 1'';
    	OPEN curseur FOR EXECUTE query;
    	FETCH curseur INTO valdate;
     
    	IF EXTRACT(WEEK FROM valdate) != EXTRACT(WEEK FROM now()) THEN
    		-- On vide la table histo chaque semaine
    		query := ''DELETE FROM '' || $1;
    		EXECUTE query;
    		-- On insert le premier enregistrement
    		strTypOp := ''''''I'''''';
    		query := ''INSERT INTO '' || $1 || '' VALUES(DEFAULT, CURRENT_DATE+CURRENT_TIME(0), 1, ''
    || strTypOp || '', 0, 0, 0, 0)'';
    		EXECUTE query;
    	END IF;
     
    	RETURN 0;
     
    END;
    '
    LANGUAGE plpgsql;

  6. #6
    Membre éclairé
    Avatar de gerald2545
    Profil pro
    Inscrit en
    Février 2003
    Messages
    744
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 744
    Points : 773
    Points
    773
    Par défaut
    si je ne m'abuse, ta fonction ne correspond pas à la description de ce que tu désirais faire en première intention?
    Cette fonction va être appelée à chaque insertion dans ta base de données (tu as beaucoup d'insertions à faire chaque semaine?)
    Sinon, ce que tu peux faire c'est d'exécuter un script 1 fois en fin de semaine qui va effacer le contenu de ta table pour les données de la semaine écoulée.
    J'ai vu dans un post récent que c'était possible d'automatiser ce genre de tâche.....
    A+

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 85
    Points : 80
    Points
    80
    Par défaut


    HHmmm, ... oui en effet! Après réflexion, c'était plus simple (voire, c'était ce qui était demandé) de vider la table toutes les semaines. Bref, changement de fonction, mais mon soucis persistait pour le nom de la table (ce qui est règlé maintenant).

    Mais [Résolu] attendra un peu...

    Tu disais qu'on pouvais automatisé des tâches... comme une crontab interne à la table?

  8. #8
    Membre éclairé
    Avatar de gerald2545
    Profil pro
    Inscrit en
    Février 2003
    Messages
    744
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 744
    Points : 773
    Points
    773
    Par défaut
    Citation Envoyé par PierrotY


    HHmmm, ... oui en effet! Après réflexion, c'était plus simple (voire, c'était ce qui était demandé)


    Citation Envoyé par PierrotY
    Tu disais qu'on pouvais automatisé des tâches... comme une crontab interne à la table?
    va voir ici : http://www.pgadmin.org/index.php, http://www.pgadmin.org/docs/1.4/pgagent.html

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 85
    Points : 80
    Points
    80
    Par défaut


    ... ce doit être la chaleur, ... la fatigue ou je ne sais pas quoi, mais, j'arrive pas à créer mon trigger!
    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
    34
    35
    36
     
    DROP FUNCTION fc_init_table(varchar);
    CREATE FUNCTION fc_init_table(varchar) RETURNS TRIGGER AS '
    DECLARE
    	query TEXT;
    	strTypOp varchar(4);
    	valdate TIMESTAMP;
    	idvaleur INTEGER;
    	curseur REFCURSOR;
    	dpSemVal DOUBLE PRECISION;
     
    BEGIN
     
    	query := ''SELECT date, idval FROM '' || $1 || '' ORDER BY idVal LIMIT 1'';
    	OPEN curseur FOR EXECUTE query;
    	FETCH curseur INTO valdate, idvaleur;
     
    	-- dpSemVal := EXTRACT(WEEK FROM valdate);
    	IF EXTRACT(WEEK FROM valdate) != EXTRACT(WEEK FROM now()) THEN
    		-- On vide la table histo
    		query := ''DELETE FROM '' || $1;
    		EXECUTE query;
    		-- On insert le premier enregistrement
    		strTypOp := ''''''I'''''';
    		query := ''INSERT INTO '' || $1 || '' VALUES(DEFAULT,
    CURRENT_DATE+CURRENT_TIME(0), 1, '' || strTypOp || '', 0, 0, 0, 0)'';
    		EXECUTE query;
    	END IF;
     
    	RETURN 0;
     
    END;
    '
    LANGUAGE plpgsql;
     
    CREATE TRIGGER trig_init_histo00 BEFORE INSERT OR UPDATE ON histo00 EXECUTE PROCEDURE fc_init_table('histo00');
    Quand j'exécute tout ça, j'ai le message d'erreur en retour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    psql:./tst.sql:34: ERREUR:  La fonction fc_init_table() n'existe pas
    ...

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 85
    Points : 80
    Points
    80
    Par défaut
    Ben en fait, c'était simplement que la fonction utilisée pour un trigger ne doit pas prendre d'arguments! Tout simplement.
    Pour ceux que ça intéresse, voilà le résultat au final:

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    CREATE FUNCTION fc_init_table(TEXT) RETURNS INTEGER AS '
    DECLARE
    	query TEXT;
    	strTypOp varchar(4);
    	valdate TIMESTAMP;
    	curseur REFCURSOR;
     
    BEGIN
     
    	query := ''SELECT date FROM histo'' || $1 || '' ORDER BY idVal LIMIT 1'';
    	OPEN curseur FOR EXECUTE query;
    	FETCH curseur INTO valdate;
     
    	IF EXTRACT(WEEK FROM valdate) != EXTRACT(WEEK FROM now()) THEN
    		-- On vide la table histo
    		query := ''DELETE FROM histo'' || $1;
    		EXECUTE query;
    		-- On reset la séquence
    		query := ''SELECT setval(''''idval'' || $1 || ''_seq'''', 1)'';
    		EXECUTE query;
    		-- On insert le premier enregistrement
    		strTypOp := ''''''I'''''';
    		query := ''INSERT INTO histo'' || $1 ||
    				'' VALUES(1, CURRENT_DATE+CURRENT_TIME(0), 1, ''
    				|| strTypOp || '', 0, 0, 0, 0)'';
    		EXECUTE query;
    	END IF;
     
    	RETURN 0;
     
    END;
    '
    LANGUAGE plpgsql;
     
    CREATE FUNCTION fc_init_histo00() RETURNS TRIGGER AS '
    DECLARE
    	query TEXT;
    BEGIN
    	query := ''SELECT * FROM fc_init_table(''''00'''');'';
    	EXECUTE query;
    	RETURN NEW;
    END;
    '
    LANGUAGE plpgsql;
     
    CREATE TRIGGER trig_init_histo00 BEFORE INSERT OR UPDATE ON histo00
    EXECUTE PROCEDURE fc_init_histo00();
    Ca fait plus de fonctions que je ne le souhaitais, ... mais j'ai pas pu faire plus court. Un grand merci à gerald2545. J'ai jeté un oeil sur pgAdmin, ... mais ça semble trop lourd pour être utilisé là où la base sera installée.
    Merci encore, ... et bon code!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Création d'un controle avec taille fixé
    Par dragondumond dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 30/04/2013, 12h13
  2. Création d'un lien avec Background de taille fixe
    Par TaleMaker dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 09/09/2009, 17h29
  3. Table à taille fixe + ScrollBar
    Par HiRoN dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 20/12/2007, 08h55
  4. Création multiple table paradox dans le code
    Par scarabee dans le forum C++Builder
    Réponses: 8
    Dernier message: 30/10/2002, 10h17

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