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 09/12/2011 21:48:15

baradji
Membre

modifier la valeur d'une sequence dans un trigger

Salue, je souhaite utiliser une sequence dans un trigger.
voici mon code

CREATE OR REPLACE FUNCTION next_sequence()
  RETURNS trigger AS $assordhole_trig$
BEGIN
SELECT nextval('asso_orders_hole_ass_id_seq');
END;
$assordhole_trig$
LANGUAGE plpgsql;
 
----------------

CREATE TRIGGER assordhole_trig AFTER INSERT ON asso_orders_hole
    FOR EACH ROW EXECUTE PROCEDURE next_sequence();

----------
A l'execution de ce insert,
INSERT INTO asso_orders_hole VALUES ('22_08-RN-128', 1022,  '2011-10-06 16:00:00-04', false, 181.600006, 181.600006);

j'ai le message d'erreur suivant:

ERROR:  query has no destination for result data
HINT:  If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT:  PL/pgSQL function "next_sequence" line 2 at SQL statement


--

Quelq'un pourra t'il me dire comment modifer la valeur de la sequence et ne rien retourner comme valeur?

Merci d'avance

Hors ligne

#2 09/12/2011 23:24:54

gleu
Administrateur

Re : modifier la valeur d'une sequence dans un trigger

Oui, il faut faire ce qu'indique le message, à savoir remplacer SELECT par PERFORM.


Guillaume.

Hors ligne

#3 12/12/2011 10:00:34

Marc Cousin
Membre

Re : modifier la valeur d'une sequence dans un trigger

Il faudrait surtout faire quelque chose de la valeur de la séquence récupérée. plpgsql dit qu'il n'y a pas de destination pour le résultat du select. Il faudrait déclarer une variable de type int ou bigint, et faire un select into pour affecter le nextval à cette variable. Et ensuite, en faire quelque chose bien entendu smile


Marc.

Hors ligne

#4 12/12/2011 16:53:09

baradji
Membre

Re : modifier la valeur d'une sequence dans un trigger

Salut les gards,
pour la 1ere proposition pour Gleu,voici ce que j'ai comme reponse:
ERROR: control reached end of trigger procedure without RETURN
SQL state: 2F005
Context: PL/pgSQL function "next_sequence"

Marc, en fait, je ne peux pas recuper cette valeur, je souhaite juste modifer la valeur de la sequence comme si je faisais un update dans la fonction, mais le probleme, on ne peut pas faire de update sur les sequences et ne rien retourner.

Hors ligne

#5 12/12/2011 17:14:25

Marc Cousin
Membre

Re : modifier la valeur d'une sequence dans un trigger

Ok, le but est vraiment d'incrémenter la valeur, mais sans s'en servir ?

Désolé, mais avant de répondre sur comment le faire, j'aimerais vraiment comprendre l'intérêt… (je pense que ça doit être une solution détournée à un problème, il y a peut-être une solution plus directe).


Marc.

Hors ligne

#6 12/12/2011 18:57:37

baradji
Membre

Re : modifier la valeur d'une sequence dans un trigger

Salut,
lors de cette discussion: http://forums.postgresql.fr/viewtopic.php?id=1747
tu m'avais fait cette suggestion qui marche bien, mais mon probleme est que quand je fais les insert des donnees provenant des roulottes manuellement, les sequences ne s'incremente pas et cela peut creer des problemes lorsque j'envois un backup de la base principale dans une roulotte.
exemple si dans la roulotte r1 par exemple, la valeur d'une sequence est a 300, et que dans la bd principale, cette valeur est a 250.
si j'envois un backup de la bd, ils auront des erreurs lors des ajouts.

merci

Hors ligne

#7 12/12/2011 19:24:16

kenrio
Membre

Re : modifier la valeur d'une sequence dans un trigger

pourquoi vous vérifiez pas le max de la sequence avant ?

Hors ligne

#8 13/12/2011 10:17:26

Marc Cousin
Membre

Re : modifier la valeur d'une sequence dans un trigger

Je pense que c'est plus un problème de syntaxe sur l'insert manuel non ? Il y a deux façons pour utiliser la valeur par défaut de la colonne:
- Utiliser le mot clé 'DEFAULT': INSERT INTO ma_table (col1,col2,col3) VALUES (DEFAULT, 'toto', 'titi') . DEFAULT lui dit d'utiliser la valeur par défaut de la colonne.
- Ne pas préciser la colonne dans la liste des colonnes de l'INSERT: INSERT INTO ma_table (col2,col3) VALUES ('toto', 'titi')


Marc.

Hors ligne

#9 13/12/2011 15:17:30

baradji
Membre

Re : modifier la valeur d'une sequence dans un trigger

Salus, merci vos efforts, mais le problemes est plus complexe que ca, dans mon insert,
INSERT INTO asso_orders_hole VALUES ('roul01341', '22_08-RN-128', 1022, 'ibaradji', '2011-10-06 11:44:35-04',  'ibaradji', '2011-10-06 16:00:00-04', false, 181.600006, 181.600006);

cette insert vient de la roulotte 01 d'ou le 'roul01341',

et ausii, je pourrai avoir aussi 'roul02341' provenant de la roulotte 02 et ainsi de suite.
l'indice 2341 est la valeur de la sequence asso_orders_hole_ass_id_seq dans la roulotte 01.
quand je recoit les backup provenant des roulottes, j'execute des centraines d'insert, mais le probeleme est que ca ne modifie pas la valeur de la sequence asso_orders_hole_ass_id_seq dans ma bd centrale. si la valeur de cette sequnce etait chez mois a 1500 et que je fais un backup et que leur transfert, ils vont executer un script qui va supprimer, creer puis restorer leur bd a partir du backup que je leur envois. tu vois la ou est le probleme? la valeu de leur sequence va revenir a 1500 alors alors qu'il devrait etre a 2342.
bon bref, s'il n'existe en postgres un moyen de faire un update sur une sequence, je pense que il est temps que cela soit revus sur les prochaines version.

Hors ligne

#10 13/12/2011 15:21:07

Marc Cousin
Membre

Re : modifier la valeur d'une sequence dans un trigger

Dans le fonctionnement non manuel, comment est-ce que le système génèrerait le roul01341 ?


Marc.

Hors ligne

#11 13/12/2011 15:33:16

baradji
Membre

Re : modifier la valeur d'une sequence dans un trigger

dans mon code php,
dans le controleur,
$asso_order_hole_id = LIEU_DB.$this->m_hole->get_nextval('asso_orders_hole_ass_id_seq');
                $ajout_hole_order = array('ass_id' => $asso_order_hole_id,
                            'ass_hol_id' => $hole_id,
                            'ass_ord_id' => $id_order,
                            'ass_hol_metrage_total' => $this->input->post('hole_totaux'),               
                            'ass_hol_metrage_metre' => ($this->input->post('unite') =='ft') ? $this->input->post('hole_totaux')*CONVERTION_TO_METER : ($this->input->post('hole_totaux')),
                            'ass_create_by' => $this->session->userdata('login_sess'),
                            'ass_create_date' => date("D M j G:i:s T Y"),
                            );
$this->m_hole->save_hole_for_order($aHole, $ajout_hole_order, $insert_hole, $this->connected_profil);

et dans le model , j'insert l'objet $ajout_hole_order

Hors ligne

#12 13/12/2011 15:46:36

Marc Cousin
Membre

Re : modifier la valeur d'une sequence dans un trigger

Ok, vous avez donc choisi ce que proposait gleu (récupérer le nextval) plutôt que ma méthode (utiliser un default). C'est ce que je n'avais pas compris.

Donc effectivement, vous pouvez déclarer un trigger sur la table. Le problème, c'est qu'avec cette méthode, vous allez générer un incrément de séquence pour tout modification de la table, par déclenchement du trigger, même si vous êtes passé par le nextval dans le code php. Et dans ce dernier cas, vous aurez donc 2 incrémentations au lieu d'une.

Il serait peut-être plus efficace de faire un trigger de ce genre:

CREATE OR REPLACE FUNCTION next_sequence()
  RETURNS trigger AS $assordhole_trig$
DECLARE
  vidseq bigint;
BEGIN
  SELECT nextval('asso_orders_hole_ass_id_seq') INTO vidseq;
  NEW.ass_hol_id:=NEW.ass_hol_id || vidseq;
  RETURN NEW;
END;
$assordhole_trig$
LANGUAGE plpgsql;

Avec un trigger (non testé smile )de ce genre, vous pouvez effectuer
"INSERT INTO asso_orders_hole VALUES ('roul01', '22_08-RN-128', 1022, 'ibaradji', '2011-10-06 11:44:35-04',  'ibaradji', '2011-10-06 16:00:00-04', false, 181.600006, 181.600006);"

Et le champ hole_id sera enrichi directement de la valeur de la séquence, qui sera incrémentée automatiquement. Ça vous enlève aussi la manipulation sur le nextval dans le code php.

Si vous avez besoin de récupérer l'id généré, vous pouvez remplacer l'INSERT simple par:

"INSERT INTO asso_orders_hole VALUES ('roul01', '22_08-RN-128', 1022, 'ibaradji', '2011-10-06 11:44:35-04',  'ibaradji', '2011-10-06 16:00:00-04', false, 181.600006, 181.600006) RETURNING ass_hol_id;"


Marc.

Hors ligne

#13 13/12/2011 17:10:41

baradji
Membre

Re : modifier la valeur d'une sequence dans un trigger

GOD BLESS YOU,
Je n'ai jamais vu de forum aussi dynamique que votre forum, je remercie tout les membres de ce forum et en particulier Marc pour leur contribution a l'evolution de postgresql qui pour moi est la meilleur bd que toute entreprise qui veut etre rentable et faire des benifices devraient utiliser.
au canada, beaucoup d'entreprise utilise slq serveur et oracle, ce qui les coute tres cher et dependant de microsoft et oracle, mais ici les gens n'ont pas la mentalite des open source, jai du imposer postgresql a ma boite, et le resultat est remarcable car cette base est tres fiable et performente.

Hors ligne

#14 13/12/2011 17:20:15

Marc Cousin
Membre

Re : modifier la valeur d'une sequence dans un trigger

La «grand messe» PostgreSQL (le PGCON) a pourtant lieu tous les ans au Canada. smile


Marc.

Hors ligne

#15 13/12/2011 17:31:25

baradji
Membre

Re : modifier la valeur d'une sequence dans un trigger

ok, merci Marc pour l'info, je m'inscrirer pour la prochaine conference de 2012.

Hors ligne

Pied de page des forums