2016-04-07 19 views
2

PreparedStatement kullanarak kayıtları güncellemem gereken bir ödevim var. Kayıt sorgu güncellemesi geri dönüş sayımını, yani etkilenen satır sayısını bildiğimiz şekilde güncellendikten sonra.JDBC'deki UPDATE sorgusundan etkilenen tüm satırlar nasıl alınır?

Ancak, sayım yerine, yanıtta güncelleme sorgusundan etkilenen satırları veya etkilenen satırların en azından id değerlerinin listesini istiyorum.

Bu benim güncelleştirme sorgum.

UPDATE User_Information uInfo SET address = uInfo.contact_number || uInfo.address where uInfo.user_id between ? AND ?; 

Normalde satır veya etkilenen tüm sıranın kimlikleri dönmelidir sıranın etkilenen ait ama benim durum sorguda sayımı dönecektir.

PostgreSQL'in returning işlevini kullandım, ancak bu durumda benim için kullanışlı değil.

+1

Aynı parametrelere sahip bir seçim deyimi yapabilir ve ardından bu güncelleştirmeyi yapabilirsiniz. –

+0

Yorumunuz için teşekkürler, ancak güncelleme sorgum çalıştırdıktan sonra sonuç kümesi – Rahul

+0

döndürülmelidir. Daha sonra, ilk seçim ifadesinden kimliği alınız, güncellemeyi yapın ve ardından kimliğinizin bulunduğu bir deyim seçin. Güncelleme ifadeleri her zaman etkilenen satır sayısını döndürür. –

cevap

4

i PostgreSQL işlevini dönen kullanılan ama bana

Öyle olmalı için kullanışlı değildir gelmiş. Belki de sadece yanlış kullanıyordunuz. Bu kod benim için çalışıyor:

sql = "UPDATE table1 SET customer = customer || 'X' WHERE customer LIKE 'ba%' RETURNING id"; 
try (PreparedStatement s = conn.prepareStatement(sql)) { 
    s.execute(); // perform the UPDATE 
    try (ResultSet rs = s.getResultSet()) { 
     // loop through rows from the RETURNING clause 
     while (rs.next()) { 
      System.out.println(rs.getInt("id")); // print the "id" value of the updated row 
     } 
    } 
} 

documentation

biz tüm güncellenmiş satırına yer vermeyi ResultSet istiyorsanız biz de RETURNING * kullanabilirsiniz gösterir.

Güncelleme:

@CraigRinger yaptığı açıklamada da anlaşılacağı gibi, PostgreSQL JDBC sürücüsü aslında çok GÜNCELLEME ifadeleri için .getGeneratedKeys() destekliyor, bu nedenle bu kod benim için de çalıştı:

sql = "UPDATE table1 SET customer = customer || 'X' WHERE customer LIKE 'ba%'"; 
try (PreparedStatement s = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { 
    s.execute(); // perform the UPDATE 
    try (ResultSet rs = s.getGeneratedKeys()) { 
     while (rs.next()) { 
      System.out.println(rs.getInt(1)); // print the "id" value of the updated row 
     } 
    } 
} 

Teşekkür Craig!

+0

Doğrudan 'GERİ DÖNÜŞTÜRME'yi kullanabilirsiniz, ancak gerek yoktur. JDBC tarafından oluşturulan tuşlar arayüzü, aynı bilgiyi standart JDBC API'sı üzerinden sormanızı sağlar. (Oh, spec dışında INSERT sorguları için yoksayıldığını söylüyor, nevermind). –

+1

@CraigRinger Doğru değil, JDBC 4.2 (bölüm 13.6) diyor ki: _ "JDBC sürücüsü, SQL INSERT deyimleri için otomatik olarak oluşturulan değerlerin döndürülmesini desteklemelidir. Bazı JDBC sürücü uygulamaları, otomatik olarak oluşturulan değerleri INSERT dışındaki SQL deyimleriyle de destekleyebilir." _. Başka bir deyişle: Diğer DML için isteğe bağlı olan 'INSERT' için destek gereklidir. Ancak API belgesindeki ifadeler kafa karıştırıcı gibi görünüyor. –

+0

RETURNING sadece postgress için denedim, RETURNING deyimiyle gayet iyi çalışıyor ama bunun için başka bir çözüm istiyorum ve ne yazık ki tüm önerilerinde benim için işe yaramadığından bahsediliyor – Rahul

3

JDBC'nin oluşturulan anahtarları alma desteğini kullanabilirsiniz. Connection.prepareStatement(String sql, int[] columnIndexes) API yöntemine bakın, ardından sonuçlara erişmek için Statement.getGeneratedKeys() kullanın.

Spec ama PostgreSQL'in JDBC sürücüsü aslında çok başka deyim türleriyle isteğinizi yerine getireceğini düşünüyorum "SQL deyimi bir INSERT ifadesi değilse sürücü dizisi yok sayacaktır" diyor.

örn. Gord Thompson tarif Aksi takdirde

PreparedStatement s = conn.prepareStatement(sql, new String[] {'id'}) 
s.executeUpdate(); 
ResultSet rs = s.getGeneratedKeys(); 

, RETURNING kullanın.

+1

Belgeler şöyle diyor: "Sürücü diziyi yoksayıyor SQL deyimi bir INSERT ifadesi değil ** veya otomatik olarak oluşturulan anahtarları döndüren bir SQL ifadesi (bu tür ifadelerin listesi satıcıya özeldir) **. Ancak, 'INSERT' dışındaki ifadeler için desteklenmesine izin verildiği anlamına gelir. –

+0

Evet ve IIRC PgJDBC, "PrepareStatement" aracılığıyla oluşturulan anahtarlarla gönderdiğiniz her şeye "RETURNING" öğesini körü körüne ekler. Sözdizimsel olmayan şeyleri içeren şeyler dahil. –

+0

Aynı problemi Jaybird/Firebird ile de yaşadım. Bazı uygulamaların (size bakarak, ColdFusion) her zaman sorgular için bile 'Statement.RETURN_GENERATED_KEYS' kullandığını görüyoruz. –

1

sütun adı veya sütun indeksi dizisi geçirerek, bu 1. yapmanın iki yol vardır prepareStatement yani conn.prepareStatement (SQL, yeni bir String [] { 'id', ''uname'}) ve 2. prepareStatement numaralı belgede Statement.RETURN_GENERATED_KEYS öğesini kullanarak.

Kodum bunun için, yani benim gereksinimime göre kodumu geliştirdim, daha iyi bir fikir sahibi olabilirsiniz.Bu durumda başarılı olmam gerektiğini düşünüyorum. Umarım bu size çok yardımcı olacaktır.

İlgili konular