2016-03-22 1 views
0

Ich möchte eine gespeicherte Funktion mehrmals im Batch aufrufen. Ich benutze JOOQ 3.7.3 und PostgreSQL 9.5. Ich habe versucht, mit select [function call] Anweisung im Batch, aber es löst die folgende Ausnahme PSQLException: A result was returned when none was expected.Wie rufen Sie eine gespeicherte Funktion im Batch mit JOOQ auf?

// exemplary 'select [function call]' 
context.batch(context.select(Routines.foo(someParam))).execute(); 

Ich habe keine andere Möglichkeit gefunden, gespeicherte Funktionen mit JOOQ im Batch aufzurufen. Ich weiß, dass es mit rohen JDBC mit CallableStatement möglich ist, also nehme ich an, dass es auch mit JOOQ möglich sein sollte.

Ist es mit JOOQ möglich, gespeicherte Funktionen im Batch aufzurufen? Wenn ja, wie geht das?

gespeicherte Funktion Unterschrift:

create function foo(param1 int, param2 int) returns boolean as $$ ... $$ language plpgsql 
+0

Können Sie die Signatur Ihrer Funktion (in pgplsql) posten? –

+0

@LukasEder getan, ich habe auch versucht, 'boolean' Wert zurückzugeben, es scheint, dass das Problem ist, dass jdbc nicht mit gespeicherten Funktionsaufrufen umgehen kann, wenn es nicht von der speziellen 'Call'-Syntax mit CallableStatement behandelt –

Antwort

1

Die select [function call] Syntax wird durch die neuesten 1208.04.09 Postgres JDBC-Treiber unterstützt. Ich habe Version 9.4.1205 verwendet.

Wenn Sie die neueste (1208.09.04) JDBC-Treiber verwenden, können Sie die folgende Syntax verwenden, wenn die gespeicherte Funktion einen Wert zurückgibt:

Query query1 = context.select(Routines.foo(someParam)); 
Query query2 = context.select(Routines.foo(someParam)); 
context.batch(query1, query2).execute(); 

Wenn die gespeicherte Funktion void kehrt können Sie:

Foo foo1 = new Foo(); foo1.setParam(someParam); 
Foo foo2 = new Foo(); foo2.setParam(someParam); 
context.batch(context.select(foo1.asField()), context.select(foo2.asField())).execute(); 
+0

Um' Routines.foo zu verwenden (someParam) 'Die gespeicherte Funktion muss einen anderen Wert als 'void' zurückgeben. Jooq erzeugt keine Hilfsmethoden in der 'Routinen'-Klasse, wenn die gespeicherte Funktion' void 'zurückgibt. –

Verwandte Themen