Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[JDBC] PreparedStatement en nextval functie

Pagina: 1
Acties:

  • m0ridin
  • Registratie: Mei 2006
  • Laatst online: 18:05
Hoop dat ik de goede tags heb gebruikt, kan zowel sql, java als jdbc zijn maar denk hoofdzakelijk het laatste.

Ik heb een postgresql database in combinatie met een java programma. Nu wil ik gebruik gaan maken van PreparedStatements maar heb veel tabellen met een serial primary key (automatische nummering).

Wanneer ik dus in een 'kind' van een dergelijke tabel een waarde wil toevoegen moet ik (soms) de nextval() functie gebruiken alleen krijg ik dit niet voor elkaar icm PreparedStatements.

De functie is om de id op te vragen is bijvoorbeeld: (SELECT nextval('table_id_seq'));

Een preparedstatement.setInt(0, "(SELECT nextval('table_id_seq'))") werkt simpelweg niet omdat de variabele geen int is.

Een preparedstatement.setString(0, "(SELECT nextval('table_id_seq'))") werkt ook niet omdat op de achtergrond de waarde toch naar een int wordt geconverteerd met als gevolg een pg_atoi error.

Waarom ik dit doe is ten eerste om af te zijn van escaping van waarden (wat overigens prima werkt, maar preparedstatements leken me gewoon veiliger). Ten tweede worden dezelfde soort queries vaker uitgevoerd en als laatsteworden er ook plaatjes in de database gestopt.

Nu kan ik binary data ook wel, via een omwegje en minder efficient, als text in de database stoppen maar het leek me mooier als ik dit ook direct via een preparedstatement zou kunnen doen.

Is er een manier om dit wel werkend te krijgen? Of moet ik echt los de waarden ophalen om die waarden dan in de preparedstatements te gooien (in dat geval denk ik dat ik het bij het oude laat, alles als een directe query doorvoeren... uiteraard met autocommit uit en in batches).

  • momania
  • Registratie: Mei 2000
  • Laatst online: 09:47

momania

iPhone 30! Bam!

Kan je niet gewoon zo je prepared statement maken:
Java:
1
2
3
PreparedStatement stmt = conn.prepareStatement("insert into tablename ('id', 'field1', 'etc') values (SELECT nextval('table_id_seq'), ? ?)");
stmt.setString(1, "bla");
stmt.setString(2, "etc");

:?

Neem je whisky mee, is het te weinig... *zucht*


  • m0ridin
  • Registratie: Mei 2006
  • Laatst online: 18:05
momania schreef op maandag 29 oktober 2007 @ 17:19:
Kan je niet gewoon zo je prepared statement maken:
Java:
1
2
3
PreparedStatement stmt = conn.prepareStatement("insert into tablename ('id', 'field1', 'etc') values (SELECT nextval('table_id_seq'), ? ?)");
stmt.setString(1, "bla");
stmt.setString(2, "etc");

:?
Sheesh, en de meest voor de hand liggende oplossing zie ik weer over het hoofd. Volgens mij moet dat prima lukken ja... Ik zal het morgen doorvoeren, tnx!

  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 11:20

voodooless

Sound is no voodoo!

Als je het id veld gewoon weglaat wordt het ook automatisch gevuld :)

Do diamonds shine on the dark side of the moon :?


  • m0ridin
  • Registratie: Mei 2006
  • Laatst online: 18:05
voodooless schreef op maandag 29 oktober 2007 @ 19:14:
Als je het id veld gewoon weglaat wordt het ook automatisch gevuld :)
Yih, dat klopt :) Maar het gaat ook meer om foreign keys die naar een automatisch gegenereerde id in een andere tabel verwijzen. De nextval was meer een voorbeeldje van wat ik bedoelde, maar ik denk dat het op deze manier idd wel moet lukken... dat ik daar zelf niet op kwam hehe.