comment récupere l'oid d'un insert dans une procedure stockée.

Le
Etienne SOBOLE
salut.

je cherche a faire une procedure stockée qui fasse deux INSERT.
le deuxieme necessitant le serial du premier.

comment je peut récupere l'id créé dans le premier INSERT ???
merci.

Etienne
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Sylvain SF
Le #21916291
Etienne SOBOLE a écrit :

comment je peut récupere l'id créé dans le premier INSERT ???



sur quel moteur ?
LAST_INSERT_ID si c'est MySQL.

Sylvain.
Etienne SOBOLE
Le #21916281
nan c'est postregsql...

"Sylvain SF" 49f8c971$0$17070$
Etienne SOBOLE a écrit :

comment je peut récupere l'id créé dans le premier INSERT ???



sur quel moteur ?
LAST_INSERT_ID si c'est MySQL.

Sylvain.
Alain Montfranc
Le #21916271
Etienne SOBOLE a écrit
salut.

je cherche a faire une procedure stockée qui fasse deux INSERT.
le deuxieme necessitant le serial du premier.

comment je peut récupere l'id créé dans le premier INSERT ???
merci.

Etienne



ATTENTION :

Le type oid est actuellement un entier de quatre octets. Il n'est pas
suffisamment grand pour garantir l'unicité dans une grosse base de
données, voire même dans une très grosse table.

Donc a eviter

Le mieux serait sans doute d'utiliser une sequence, de recuperer un
nouveau numéro en début de procedure stockée et de l'utiliser comme
clef unique des données insérées

http://docs.postgresql.fr/8.3/datatype-oid.html
Alain Montfranc
Le #21916261
(supersedes
Etienne SOBOLE a écrit
salut.

je cherche a faire une procedure stockée qui fasse deux INSERT.
le deuxieme necessitant le serial du premier.

comment je peut récupere l'id créé dans le premier INSERT ???
merci.

Etienne



ATTENTION :

Le type oid est actuellement un entier de quatre octets. Il n'est pas
suffisamment grand pour garantir l'unicité dans une grosse base de
données, voire même dans une très grosse table.
(http://docs.postgresql.fr/8.3/datatype-oid.html)

Donc a eviter

Le mieux serait sans doute d'utiliser une sequence, de recuperer un
nouveau numéro en début de procedure stockée et de l'utiliser comme
clef unique des données insérées
Jogo
Le #21916251
Sur fr.comp.applications.sgbd, Etienne SOBOLE disait :

nan c'est postregsql...



Bon alors si c'est au moins une version 8.2, tu peux peut-être
utiliser RETURNING :

INSERT INTO Table1 (flu, blu)
VALUES ('foo',27)
RETURNING id;

Et tu gères ça comme un select dans le langage client (donc avec un
truc comme fetchrow).

Si tu fais du PL/PgSQL, alors c'est :

INSERT INTO Table1 (flu, blu)
VALUES ('foo',27)
RETURNING id INTO var;

INSERT INTO Table2 (ref, val)
VALUES (var, 'foobar');

--
Il n'est personne aujourd'hui, de vraiment cultivé,
pour parlé de la beauté d'un couché de soleil.
-- Wilde
Etienne SOBOLE
Le #21917301
Heu oui effectivement tu as raison.

Ce dont j'ai besoin c'est du serial...
mais habituellement je fais un

INSERT ...
SELECT idtable FROM table WHERE oid = OID_OBTENU;

comment recupère t on un serial sans passer par cette methode ???

merci.
Etienne

"Alain Montfranc"
(supersedes
Etienne SOBOLE a écrit
salut.

je cherche a faire une procedure stockée qui fasse deux INSERT.
le deuxieme necessitant le serial du premier.

comment je peut récupere l'id créé dans le premier INSERT ???
merci.

Etienne



ATTENTION :

Le type oid est actuellement un entier de quatre octets. Il n'est pas
suffisamment grand pour garantir l'unicité dans une grosse base de
données, voire même dans une très grosse table.
(http://docs.postgresql.fr/8.3/datatype-oid.html)

Donc a eviter

Le mieux serait sans doute d'utiliser une sequence, de recuperer un
nouveau numéro en début de procedure stockée et de l'utiliser comme clef
unique des données insérées


Etienne SOBOLE
Le #21917291
INSERT INTO Table1 (flu, blu)
VALUES ('foo',27)
RETURNING id INTO var;

INSERT INTO Table2 (ref, val)
VALUES (var, 'foobar');



Ah... merci.

je vais essayer ca.
Etienne
Patrick Mevzek
Le #21917271
Le Wed, 13 May 2009 13:32:42 +0200, Etienne SOBOLE a écrit:
Ce dont j'ai besoin c'est du serial... mais habituellement je fais un

INSERT ...
SELECT idtable FROM table WHERE oid = OID_OBTENU;

comment recupère t on un serial sans passer par cette methode ???



SELECT currval('lenomdelasequence');

--
Patrick Mevzek . . . . . . . . . . . . . . Dot and Co
Alain Montfranc
Le #21917251
Patrick Mevzek a écrit
Le Wed, 13 May 2009 13:32:42 +0200, Etienne SOBOLE a écrit:
Ce dont j'ai besoin c'est du serial... mais habituellement je fais un

INSERT ...
SELECT idtable FROM table WHERE oid = OID_OBTENU;

comment recupère t on un serial sans passer par cette methode ???



SELECT currval('lenomdelasequence');



Oui mais il peut y avoir doublons.

Le mieux est de demander d'abord une nouvelle valeur de sequence
(nextval) et de l'utiliser pour les inserts qui suivent : on est alors
assuré de l'unicité de la valeur même en cas d'exécutions en parallele
Patrick Mevzek
Le #21917241
Le Wed, 13 May 2009 20:23:41 +0200, Alain Montfranc a écrit:
Oui mais il peut y avoir doublons.



Non, il ne peut pas.

Le mieux est de demander d'abord une nouvelle valeur de sequence
(nextval) et de l'utiliser pour les inserts qui suivent : on est alors
assuré de l'unicité de la valeur même en cas d'exécutions en parallele



On l'est tout autant avec currval. PostgreSQL assure que c'est la
dernière valeur *de la session* courante, donc indépendamment de ce qui
se passe ailleurs. Ce n'est PAS la même chose qu'un select max(...) ou
équivalent.

--
Patrick Mevzek . . . . . . . . . . . . . . Dot and Co
Publicité
Poster une réponse
Anonyme