2009-03-12 5 views
1

Ich habe die folgenden Frühling JDBC-API StoredProcedure Unterklasse geschrieben:Wie schreibe ich StoredProcedure-Unterklassen, um Oracle-Funktionen aufzurufen?

class GetLdapPropertiesStoredProcedure extends StoredProcedure { 

protected GetLdapPropertiesStoredProcedure(JdbcTemplate jdbcTemplate) { 
    super(jdbcTemplate, "get_ldap_properties"); 
    setFunction(true); 
    declareParameter(new SqlReturnResultSet("rs", new ProductPropertiesMapper())); 
    declareParameter(new SqlParameter("in_ldap_code", Types.VARCHAR)); 
    compile(); 
} 

public Properties execute(String productCode) { 
    HashMap input = new HashMap(); 
    input.put("in_ldap_code", productCode); 

    Map results = execute(input); 

    Collection<Map.Entry<Object,Object>> entries = (Collection<Map.Entry<Object,Object>>) results.get("rs"); 
    Properties properties = new Properties(); 
    properties.entrySet().addAll(entries); 
    return properties; 
} 

} 

, das die folgenden Oracle-Funktion aufruft:

FUNCTION get_ldap_properties (
in_ldap_code IN VARCHAR2 
) 
RETURN rowset; 

Allerdings, wenn ich die oben nenne ich die folgende Oracle Ausnahme erhalten :

java.sql.SQLException: ORA-06550: line 1, column 13: 
PLS-00306: wrong number or types of arguments in call to 'GET_LDAP_PROPERTIES' 
ORA-06550: line 1, column 7: 
PL/SQL: Statement ignored 

Kann jemand bitte sehen, was ich falsch mache?

Antwort

3

Dies ist die Aussage, die Sie für einen Funktionsaufruf erhalten werden (das heißt mit SetFunction (true) ):

{ ? = call get_ldap_properties(?) } 

Sie müssen also einen ersten out-Parameter für den Rückgabewert hinzuzufügen. Versuchen Sie stattdessen:

setFunction(true); 

// The return value parameter must be the first parameter that you declare. 
declareParameter(new SqlOutParameter("RETURN_VALUE", OracleTypes.CURSOR, new ProductPropertiesMapper())); 

Edit: Der Fehler, die Syntax mit der Funktion des Rückgabewert und das Rowset beschäftigen, wenn Oracle mit nach Thomas Risberg dem answer zum Spring Community Forum.

+0

Danke für die Antwort, aber das sagt mir nicht, wie man das Rowset-Zeug repariert. Dies beantwortet die Frage: http://forum.springframework.org/showthread.php?p=231407 –

+0

Es gab 2 Dinge hier: ein SqlOutParamater als ** ersten ** Parameter hinzufügen und den guten Typ verwenden. Ich weiß nicht, warum ich Types.VARCHAR geschrieben habe ... Ich werde die Antwort reparieren. –

+0

Danke für diese Antwort. –