J'ai une procédure stockée simple qui fait un insert à une table avec une colonne de clé primaire d'identité. J'ai besoin d'obtenir la clé générée par l'insert. Je préférerais utiliser la méthode JDBC getGeneratedKeys standard, mais je ne suis pas sûr de ce que la procédure stockée doit faire/retourner pour construire ce jeu de résultats. Mon objectif final est de le faire depuis Hibernate. J'ai également essayé d'utiliser le générateur d'identité de sélection, mais il renvoie toujours 0.Comment puis-je renvoyer les clés générées à JDBC à partir d'une procédure stockée DB2 qui effectue une insertion?
Répondre
Je ne l'ai jamais essayé le val identité fonction locale(); dans mes propres procédures stockées, je viens de faire un SELECT après l'insertion. Mais vous pouvez avoir une procédure stockée renvoie un jeu de résultats:
create procedure proc1(
IN in_val
)
language sql
dynamic result sets 1
BEGIN
-- do insert
BEGIN
DECLARE c_out CURSOR WITH RETURN TO CLIENT FOR
select max(key) as inserted_key from table where val = in_val
FOR READ ONLY;
OPEN c_out;
END;
END;
Vous pouvez probablement utiliser l'identité locale remplaçant val la sélection avec « identité select val local() à partir sysibm.sysdummy1 ». Je n'arrive pas à obtenir les traits de soulignement pour travailler dans la démarque, mais j'espère que c'est clair.
Sur DB2/400, il semble que ce soit la fonction IDENTITY_VAL_LOCAL() qui renvoie la dernière valeur affectée à une colonne d'identité.
http://publib.boulder.ibm.com/infocenter/db2luw/v8/topic/com.ibm.db2.udb.doc/admin/r0004231.htm
est vrai, mais cela ne fonctionne pas lorsque l'insert est dans une procédure stockée et vous devez obtenir la clé après la sortie de la procédure. –
La valeur de la clé peut être placée dans un paramètre out pour la procédure stockée – mjn
True encore, mais j'espérais qu'il y avait un moyen de s'intégrer proprement dans Hibernate qui vous permet soit d'utiliser la méthode JDBC getGeneratedKeys ou de définir une requête qui obtiendra la dernière clé. –
La procédure stockée peut utiliser identity val local pour obtenir la valeur générée et la transmettre en tant que paramètre de sortie au programme Java. Sélectionner après l'insertion n'est pas une bonne idée car d'autres processus peuvent avoir inséré de nouvelles données dans la table et entraîner des problèmes d'intégrité des données.
Il est également possible de sélectionner de l'insert:
SELECT pkey FROM FINAL TABLE (INSERT INTO tab(a, b, c, d) VALUES ...)
Cela semble beaucoup plus simple que la réponse acceptée ... –
C'est ma solution jusqu'à présent, mais cela nécessite l'utilisation d'un générateur d'identité Hibernate personnalisé. J'espérais qu'il y avait un moyen de le faire fonctionner avec les options Hibernate par défaut (getGeneratedKeys ou un second select en utilisant identity_val_local()). –
Quelle méthode utilisez-vous pour appeler la procédure stockée? Voir http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/ad/tjvjdidn.htm – weiyin
Cela semble être à peu près aussi proche que Je peux obtenir. identity_val_local() ne conserve pas sa valeur lorsque la procédure se termine. –