Java Spring JDBC Oracle存储过程返回null [重复]

Posted

技术标签:

【中文标题】Java Spring JDBC Oracle存储过程返回null [重复]【英文标题】:Java Spring JDBC Oracle Stored Procedure returns null [duplicate] 【发布时间】:2011-02-14 18:24:05 【问题描述】:

可能重复:Spring's Stored Procedure - results coming back from procedure always empty.

我有以下代码,虽然我知道调用应该会产生内容,但我总是返回一个空的结果集,谁能告诉我为什么?

ParameterizedRowMapper<ExamPaper> mapper = new ParameterizedRowMapper<ExamPaper>() 

  public ExamPaper mapRow(ResultSet rs, int rowNum) throws SQLException 


    logger.info("in the row mapper with"+rs.toString());
    logger.info("in the row mapper with x no of rows " +rowNum);

    ExamPaper examPaper = new ExamPaper();
    examPaper.setCampus(rs.getString("campus"));
    examPaper.setTitle(rs.getString("title"));
    examPaper.setPaper(rs.getString("paper"));
    examPaper.setCode(rs.getString("code"));
    examPaper.year.add(rs.getString("year"));
    examPaper.semester.add(rs.getString("semester"));
    return examPaper;
  
;

Map params = new HashMap();
params.put("ic_search_string","fluid");
params.put("ic_location_flag", "unmc");
logger.info("calling stored procedure");
OracleStoredProcedure storedProcedure = new OracleStoredProcedure(getDataSource(),"pkg_exam_papers.p_get_exam_papers",logger, mapper);

Map results = storedProcedure.execute(params);
logger.info(results.size());

public class OracleStoredProcedure extends StoredProcedure 

  private Log logger;
  public OracleStoredProcedure(DataSource dataSource,String storedProcedureName, Log logger,ParameterizedRowMapper mapper)
  
    super();
    this.logger = logger;

    setDataSource(dataSource);
    setFunction(false);
    setSql(storedProcedureName)

    declareParameter(new SqlParameter("ic_search_string", OracleTypes.VARCHAR));
    declareParameter(new SqlParameter("ic_location_flag", OracleTypes.VARCHAR));
    declareParameter(new SqlOutParameter("orc_results", OracleTypes.CURSOR, mapper));
    declareParameter(new SqlOutParameter("on_errcode", OracleTypes.INTEGER));
    declareParameter(new SqlOutParameter("oc_errmess", OracleTypes.CHAR));

    compile();

  

  public Map execute(Map parameters)
  
    Map out = new HashMap();

    try 
    
      out = super.execute(parameters);
    
    catch (NullPointerException nullPointerException)
    
      logger.error("Exception when executing stored procedure: " + nullPointerException.getMessage());
    
    catch(Exception exception)
    
      logger.error("Exception when executing stored procedure: " + exception.getMessage());
    

    return out;
  

【问题讨论】:

对您的代码进行一些格式化确实有助于提高可读性。有很多空白区域可以滚动。 存储过程是什么样的?无论如何,它的标题。 抱歉代码格式化 - 急于离开办公室并想发布问题 - 现在编辑 将尽快发布存储的 proc 标头 【参考方案1】:

乍一看还不错。您是否尝试过在 sqlDeveloper 中使用相同的参数对同一个数据库运行存储过程,以确保它实际返回结果?

【讨论】:

是的,它返回 sqldeveloper 等效结果(我使用 db visualiser)【参考方案2】:

我认为一年前的另一个类似问题回答了您的问题:Spring's Stored Procedure - results coming back from procedure always empty

【讨论】:

另一篇文章导致将行映射器作为内部类提供,这似乎是答案感谢 gigatron

以上是关于Java Spring JDBC Oracle存储过程返回null [重复]的主要内容,如果未能解决你的问题,请参考以下文章

spring+ibatis 调用Oracle存储过程出错

spring中如何调用存储过程

如何通过 JDBC 将 Java 存储过程加载到 Oracle 10g 中?

Java Spring JDBC 调用存储过程(Stored Procedure) 输入(In)输出(Out)参数

使用JDBC从Java调用Oracle SQL中的存储过程的示例

java调用Oracle中的存储过程与存储函数