2011-09-02 6 views
8

Ho questa procedura nel database:Perché viene visualizzato un errore che informa che "non era previsto un risultato" durante l'esecuzione di stored procedure su PostgreSQL da Java in un batch?

CREATE OR REPLACE FUNCTION replacePageRelevance(id INT, value REAL) RETURNS VOID AS $$ 
BEGIN 
INSERT INTO pageRelevance VALUES (id,value); 
EXCEPTION WHEN unique_violation THEN 
    UPDATE pageRelevance SET relevance = value WHERE pageId = id;  
END 
$$ 
LANGUAGE plpgsql; 

E questo codice che chiama questa funzione:

private final String PAGE_RELEVANCE_SQL = "SELECT replacePageRelevance(?,?::REAL)"; 
try (CallableStatement cstm = conn.prepareCall(PAGE_RELEVANCE_SQL)) { 
     for (Map.Entry<Integer, Double> entry : weightMap.entrySet()) { 
      cstm.setInt(1, entry.getKey()); 
      cstm.setDouble(2, entry.getValue()); 
      cstm.addBatch(); 
     } 
     cstm.executeBatch(); 
    } catch (SQLException e) { 
     LOGGER.error("Error discovering pages relevance: " + e.getNextException()); 
    } 
} 

Quando eseguo il lotto, i valori vengono inseriti o sostituiti nella tabella, ma dopo che, sto diventando un'eccezione informa che A result was returned when none was expected.

non so ciò che è sbagliato, se il modo in cui io chiamo la procedura o la procedura stessa. Quale può essere il problema e come risolverlo?

Chiamare una procedura con SELECT è il modo giusto/unico?

risposta

6

Da quello che posso dire che stai utilizzando SELECT quando deve essere utilizzato call.

Un esempio dal PostgreSQL documentation on the JDBC interface:

// Turn transactions off. 
con.setAutoCommit(false); 
// Procedure call. 
CallableStatement upperProc = con.prepareCall("{ ? = call upper(?) }"); 
upperProc.registerOutParameter(1, Types.VARCHAR); 
upperProc.setString(2, "lowercase to uppercase"); 
upperProc.execute(); 
String upperCased = upperProc.getString(1); 
upperProc.close(); 

Si noti che la sintassi ? = call per il risultato non è necessaria nel tuo caso - si vuole utilizzare solo call replacePageRelevance(?,?::REAL)

La ragione per cui questa sintassi differisce dalla effettiva PostgreSQL è perché fa parte di JDBC specification.

+1

'CALL' non funziona su PostgreSQL. –

+0

@ Renato - Hai provato? http://www.postgresql.org/docs/7.4/static/jdbc-callproc.html (non riusciva a trovare documentazione per 9,0) –

+0

ho provato solo con una chiamata al posto della SELECT. Sto provando con questo esempio, ma la mia funzione restituisce VOID. –

Problemi correlati