2010-11-18 12 views
0

Gibt es eine Möglichkeit zum Abrufen von Datenbank generierten Werten in Java anders als IDENTITY Felder? Ich kann leicht IDENTITY-Werte von einem ResultSet erhalten, aber ich möchte den Wert eines Datumsfeldes erhalten, das von der Datenbank (CURRENT_TIMESTAMP) erzeugt worden ist. Ich möchte lieber keine weitere SELECT-Abfrage senden, um das Datum zu erhalten.Get CURRENT_TIMESTAMP als Teil von 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. 
} 

Antwort

0

Sie verwenden SQL 2005 oder höher Unter der Annahme, könnten Sie eine OUTPUT Klausel Ihre Insert-Anweisung hinzufügen zu haben es gibt eine Ergebnismenge zurück.

Ich bin mir nicht sicher, ob der Java-Syntax der Suchresultates abzurufen, aber es wäre so etwas wie die folgenden sein:

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

Großartig, das funktioniert gut. Ich nehme an, dass es keinen datenbankunabhängigen Weg gibt ... (zB Max

+0

@ Max - die OUTPUT-Klausel scheint nicht Teil des ANSI-Standards zu sein, also ist es nur SQL Server. Andere Datenbank-Engines können ihre eigenen Implementierungen haben; Oracle hat 'RETURNING', das auch Postgres implementiert. Es gibt keine Entsprechung in MSSQL vor 2005 oder in SQLite für diese Angelegenheit. Die portabelste Methode wäre es, die Logik in eine gespeicherte Prozedur einzubetten, die eine Ergebnismenge (oder Ausgabeparameter) zurückgibt - dies ist jedoch aufgrund der unterschiedlichen SP-Implementierung in jedem RDBMS nicht datenbankunabhängig. –

+0

Danke nochmal. Ich werde das berücksichtigen. – Max

2

Haben Sie so etwas wie

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

versucht haben, einen Blick auf OUTPUT Clause (Transact-SQL)

+0

Danke, das ist genau das, was ich gesucht habe. – Max