我正在使用Java和Ibatis在oracle数据库上调用存储过程。我似乎在设置参数问题。
商店程序如下所示:
PROCEDURE Get_Semployees_By_Clt_ID
(
client_id IN HRIS.SEMPLOYEES.SEE_CLT_ID%TYPE,
ref_cursor OUT SYS_REFCURSOR
);
我的Ibatis SqlMap:
<sqlMap namespace="Foo">
<resultMap id="employee-map" class="MyFoo">
<result property="foo1" column="foo1"/>
<result property="foo2" column="foo2"/>
</resultMap>
<parameterMap id="clientEmployeesParms" class="java.util.Map" >
<parameter property="in1" jdbcType="INTEGER" javaType="java.lang.Integer" mode="IN"/>
<parameter property="output1" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT" />
</parameterMap>
<procedure id="clientEmployees" parameterMap="clientEmployeesParms" resultMap="employee-map">
{ call Package.Get_Clt_ID(?,?) }
</procedure>
</sqlMap>
我的Java:
resource = "SqlMapConfig.xml";
reader = Resources.getResourceAsReader (resource);
sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
Map map = new HashMap();
map.put("in1", new Integer(23));
list = sqlMap.queryForList("Foo.clientEmployees", map);
错误:
--- The error occurred while applying a parameter map.
--- Check the Employee.clientEmployeesParms.
--- Check the output parameters (retrieval of output parameters failed).
--- Cause: java.lang.NullPointerException
Caused by: java.lang.NullPointerException
at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:188)
at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForList(GeneralStatement.java:123)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:610)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:584)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList(SqlMapSessionImpl.java:101)
at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForList(SqlMapClientImpl.java:78)
at com.apache.struts.employee.model.IbatisStoredProcedure.main(IbatisStoredProcedure.java:30)
答案 0 :(得分:3)
我遇到了完全相同的问题。它是在2.1.5之前的iBatis和类路径中的log4j时生成的。
您可以在此处找到更多信息:
https://issues.apache.org/jira/browse/IBATIS-152
更新到iBatis 2.1.5或从类路径中删除log4j。
答案 1 :(得分:0)
我使用iBatis.NET和Oracle,并且我能够从存储过程中获取refcursor的方式如下(请注意,输出参数在列表中为First,属性/列与sproc匹配:
<parameterMap id="GetServiceTypes-param">
<parameter property="P_CURSOR" direction="Output" column="P_CURSOR" dbType="RefCursor"/>
<parameter property="P_TYPSERVICETYPE" direction="Input" />
</parameterMap>
...
PROCEDURE GETSERVICETYPES(P_CURSOR OUT CURDATA,
P_TYPSERVICETYPE CLM_SERVICE_TYPES_TBL.SERVICETYPE%TYPE := NULL);
答案 2 :(得分:-2)
彼得。你经历训练营吗? (我在你工作的地方工作,可能在同一栋楼里。明天我会给你发一封电子邮件。)
我认为问题是因为resultMap需要具有与过程返回的属性名称相同的属性名称。在这种情况下,无论在光标中选择什么。