Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#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
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é )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.
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
Pages : 1