Le printemps de la Procédure Stockée - résultats de revenir à une procédure toujours vide
Je suis à l'aide du Printemps JdbcTemplate et StoredProcedure classes. J'ai de la difficulté à obtenir la procédure stockée classe pour travailler pour moi.
J'ai une procédure stockée sur une base de données oracle. Sa signature est
CREATE OR REPLACE PROCEDURE PRC_GET_USERS_BY_SECTION
(user_cursor OUT Pkg_Types.cursor_type
, section_option_in IN Varchar2
, section_in IN Varchar2) AS ....
où
TYPE cursor_type IS REF CURSOR;
J'ai créer la procédure stockée suivante classe pour obtenir des informations à partir de l'oracle de la procédure
private class MyStoredProcedure extends StoredProcedure
{
public MyStoredProcedure(JdbcTemplate argJdbcTemplate)
{
super(argJdbcTemplate, "PRC_GET_USERS_BY_SECTION");
declareParameter(new SqlOutParameter("output", OracleTypes.CURSOR));
declareParameter(new SqlParameter("input1", Types.VARCHAR));
declareParameter(new SqlParameter("input2", Types.VARCHAR));
compile();
}
public Map<String, Object> execute() {
Map<String, Object> inParams = new HashMap<String, Object>();
inParams.put("input1", "BG");
inParams.put("input2", "FE");
Map output = execute(inParams);
return output;
}
}
Je suis à l'appel de cette dans une méthode dans une de mes classes DAO
public List<String> getUserListFromProcedure() throws BatchManagerException
{
MyStoredProcedure sp = new MyStoredProcedure( this.jdbcTemplate );
Map<String, Object> result = new HashMap<String, Object>();
try
{
result = sp.execute();
}
catch( DataAccessException dae)
{
}
System.out.println(result.size());
return null;
}
Cependant la taille de la carte est toujours à 0, de sorte que rien ne revient. Je sais qu'il y a de lignes dans la base de données qui correspondent à mes critères d'entrée. Aussi, j'ai eu le code de travail qui a utilisé java.sql.CallableStatement
pour interagir avec le proc stockée oracle - de sorte que le proc est bon. Est-il tort de mélanger les OraceleTypes.CURSOR
avec le Printemps de la Procédure Stockée? Quoi d'autre puis-je utiliser? J'ai aussi essayé SqlReturnResultSet
et qui ne fonctionne pas non plus.
OriginalL'auteur aos | 2010-01-28
Vous devez vous connecter pour publier un commentaire.
Le problème ici est que l'Oracle de la façon de faire les procédures stockées n'est pas compatible JDBC. Oracle SPs de retour resultset données via des paramètres ou des valeurs de retour des curseurs, et ils doivent être traités spécialement. Cela signifie que vous ne pouvez pas utiliser Spring JDBC de trucs qui suppose la conformité avec JDBC, vous devez le faire vous-même.
Dans la pratique, cela signifie que vous devez utiliser
JdbcTemplate
etCallableStatementCallback
, ce qui signifie beaucoup plus manuel JDBC de codage que vous ne l'idéal, mais je n'ai pas encore trouver un moyen d'éviter cela.Sur un léger côté, je soupçonne plutôt que la JDBC spec a été écrit à se conformer étroitement à l'Sybase (et, par association, SQL Server) façon de faire les choses, parce que la façon dont les procédures stockées, traitées dans JDBC est un très bon ajustement pour ces systèmes (et un mauvais ajustement pour Oracle).
Vous devriez avoir répondu à votre propre question et sélectionnée comme accepté de répondre. Merci pour l'affichage de toute façon.
OriginalL'auteur skaffman
Le problème est simple, si vous ne passez pas d'un RowMapper tout en déclarant les outparam qui est un CURSEUR. Le printemps va revenir
{}
I. e vide curseur.Où ApplicationMapper est ma coutume mappeur qui implémente RowMapper.
OriginalL'auteur Sahaya Reegan