2010-11-18 6 views
0

Existe-t-il un moyen de récupérer les valeurs générées par la base de données dans Java autres que les champs IDENTITY? Je peux facilement obtenir des valeurs IDENTITY à partir d'un ResultSet, mais j'aimerais obtenir la valeur d'un champ date qui a été généré par la base de données (CURRENT_TIMESTAMP). Je préfère ne pas envoyer une autre requête SELECT pour obtenir la date.Obtenez CURRENT_TIMESTAMP dans le cadre de ResultSet

statement = connection.prepareStatement("INSERT INTO foo (bar_date) VALUES (CURRENT_TIMESTAMP)"); 
ResultSet generatedKey = statement.getGeneratedKeys(); 
while (generatedKey.next()) { 
    // read the key..., this unfortunately only returns IDENTITY columns. 
} 

Répondre

0

En supposant que vous utilisez SQL Server 2005 ou version ultérieure, vous pouvez ajouter une clause OUTPUT à votre déclaration d'insertion d'avoir il retourne un ensemble de résultats.

Je ne suis pas sûr de la syntaxe Java pour récupérer l'ensemble de résultats, mais ce serait quelque chose comme ce qui suit:

statement = connection.prepareStatement("INSERT INTO foo OUTPUT inserted.id, inserted.bar_date (bar_date) VALUES (CURRENT_TIMESTAMP)"); //guessing the name of the id column 
ResultSet returnSet = statement.execute(); // or however you do this 
while (resultset.next()) { 
    // resultset will have two columns - id and bar_date 
} 
+0

Super, ça marche bien. Je suppose qu'il n'y a pas de manière indépendante de la base de données de faire cela ... (comme Max

+0

@Max - La clause OUTPUT ne semble pas faire partie du standard ANSI, donc c'est un serveur SQL seulement. Les autres moteurs de base de données peuvent avoir leurs propres implémentations; Oracle a 'RETURNING', que Postgres implémente également. Il n'y a pas d'équivalent dans MSSQL avant 2005, ou dans sqlite d'ailleurs. La méthode la plus portable consisterait à intégrer la logique dans une procédure stockée qui renvoie un ensemble de résultats (ou des paramètres de sortie) - mais cela ne sera pas indépendant de la base de données en raison des différences d'implémentation SP dans chaque SGBDR. –

+0

Merci encore. Je vais prendre cela en considération. – Max

2

Avez-vous essayé quelque chose comme

INSERT INTO foo (bar_date) 
OUTPUT INSERTED.bar_date 
VALUES (CURRENT_TIMESTAMP) 

un coup d'oeil à OUTPUT Clause (Transact-SQL)

+0

Merci, c'est exactement ce que je cherchais. – Max