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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring+ibatis 调用Oracle存储过程出错相关的知识,希望对你有一定的参考价值。

项目中调用存储过程,报错为无效的列类型,但存储过程没有错误,可以运行
不知是哪的问题,请各位帮忙!
sqlmap配置:
<parameterMap class="map" id="procedure">
<parameter property="in1" jdbcType="varchar2" javaType="java.lang.String" mode="IN" />
<parameter property="out1" jdbcType="varchar2" javaType="java.lang.String" mode="OUT" />
</parameterMap>
<procedure id="updateMFund" parameterMap="procedure">
call UPDATE_M_TEST(?,?)
</procedure>

方法:
public String updateMFundByProcedure(HashMap<String, String> map)
getSqlMapClientTemplate().queryForObject("LCP_W_FUND_NET_PERFORMANCE.updateMFund", map);
return map.get("out1");


map为传进来的参数:
HashMap<String, String> map = new HashMap<String, String>();
String result = "";
map.put("in1", "update");
map.put("out1", result);
请各位高手帮忙啊,急!

jdbcType应该采用标准的数据类型,varchar2是oracle自定义的,非标准的。

改成 jdbcType="VARCHAR" 再试试
参考技术A jdbcType要写成VARCHAR
====
<parameter property="NO" javaType="java.lang.String" jdbcType="VARCHAR" mode="IN" />
<parameter property="START" javaType="java.lang.Integer" jdbcType="INTEGER" mode="IN"/>
参考技术B String result = "";这个参数你试验下,如果不为空,看看是什么样

超出最大打开游标 - Oracle 11g | ibatis 2.3.4 |春天 3.0.3

【中文标题】超出最大打开游标 - Oracle 11g | ibatis 2.3.4 |春天 3.0.3【英文标题】:Max open cursors exceeded - Oracle 11g | ibatis 2.3.4 | spring 3.0.3 【发布时间】:2013-09-15 01:25:45 【问题描述】:

我们最近从 Sybase 迁移到 Oracle 11g 数据库。我们的应用程序使用 spring 3.0.3 和 IBATIS 2.3.4 与数据库交互。 最近,我们开始面临 ORA-01000 Maximum open cursors exceeded 异常。 我们与我们的 DBA 进行了交谈,他确认对于每一行插入,我们都占用了一个不正确的游标。游标大小由 DBA 设置为 300。

您能否建议我们如何通过 ibatis 配置或 Java 代码来处理这个问题? 我们从未遇到过 Sybase 的这个问题。

我们的 DAO 类中的当前代码结构:

try
    sqlMapClient.startTransaction();
    sqlMapClient.startBatch();

    for(...)
        sqlMapClient.insert(<in table 1>);
        sqlMapClient.insert(<in table 2>);
    

    sqlMapClient.executeBatchDetailed();
    sqlMapClient.commitTransaction();


catch(..)



finally

    sqlMapClient.endTransaction();


注意:我们不能执行中间提交,因为操作需要全部或无。

【问题讨论】:

【参考方案1】:

您可以使用以下语句来增加游标数量。只有 DBA 用户可以执行以下语句。每当您的 pl/sql 编码出现性能问题时,就会出现此问题。请尝试调整procedure / sql。

ALTER SYSTEM SET open_cursors = 400 SCOPE=BOTH;

【讨论】:

感谢您的建议,但是我们的 DBA 认为,与其增加光标大小,不如通过 iBatis 配置设置或通过 java 代码正确处理。原因是我们为每个插入使用了一个游标,而不是每批插入,这不是正确的方法。

以上是关于spring+ibatis 调用Oracle存储过程出错的主要内容,如果未能解决你的问题,请参考以下文章

超出最大打开游标 - Oracle 11g | ibatis 2.3.4 |春天 3.0.3

ibatis 怎么返回oracle游标

IBatis.Net使用总结-- IBatis 调用存储过程

spring中如何调用存储过程

从java调用oracle存储过程时在mybatis mapper中映射多个out参数

如何使用实体管理器在spring中调用oracle存储过程?