2007-06-29

在Ibatis中调用存储过程或存储的函数。
和调用sql语句不同的是需要设置入参和出参
这篇文章已经说的很详细了。
http://www.delphibbs.com/keylife/iblog_show.asp?xid=28107
可是我配置的时候确怎么也得不到正确的结果,错误大致是“记录数太多”,查询了很多资料才发现原来Ibatis2.2之前是不支持存储过程返回CURSOR,所以请需要使用Ibatis调用存储过程并且获取记录集游标的同学注意了。下面帖一个我的配置:
-----------------------------------------------
<!-- 获取用户列表 -->
<resultMap id="rm_out_getUserList" class="java.util.HashMap">
<result property="id" column="id" />
<result property="name" column="name" />
<result property="gname" column="gname" />
<result property="cname" column="cname" />
</resultMap>
<parameterMap id="pm_in_getUserList"
class="java.util.Map">
<parameter property="result" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT" resultMap="rm_out_getUserList" />
<parameter property="p_name" jdbcType="VARCHAR2" javaType="java.lang.String" mode="IN" />
<parameter property="p_gname" jdbcType="VARCHAR2" javaType="java.lang.String" mode="IN" />
<parameter property="p_cname" jdbcType="VARCHAR2" javaType="java.lang.String" mode="IN" />
</parameterMap>
<procedure id="getUserList"
parameterMap="pm_in_getUserList">
{? = call PCK_USER.F_GET_USER(?,?,?)}
</procedure>
----------------------------------------------
绿色部分要注意(配置的第一行),如果是要将结果集以map形式返回,一定要写HashMap。
google的document又变样子了.
左侧是一个树形的文件管理,右侧的主要部分列出了已有文件,顶部是一条菜单,越来越像一个资源管理器了!

2007-06-22

Ibatis中如何调用oracle存储的函数
如在oracle中有个package叫做PCK_VIEW,在PCK_VIEW里面有个F_GET_SITESNAPSHOT_TIME的函数有一个varchar2参数
-------------------------------------------
function F_GET_PARTNER_LIST(p_tmp varchar2)
return RecordSet
is
l_rs RecordSet;
begin
open l_rs for select partner from T_PARTNER order by UPPER(partner) asc;
return l_rs;
end F_GET_PARTNER_LIST;
-------------------------------------------
在ibatils里面配置调用是{ call PCK_VIEW.F_GET_SITESNAPSHOT_TIME(?) }
我确定参数都配置好了,但是调用的时候还是报错啊
-------------------------------------------
--- The error occurred in com/phoenixtv/stat/dao/ibatis/sql/realtime.xml. --- The error occurred while applying a parameter map. --- Check the stat.realtime.pm_in_getSiteSnapshotTime. --- Check the statement (update procedure failed). --- Cause: java.sql.SQLException: ORA-06550: line 1, column 7: PLS-00221: 'F_GET_SITESNAPSHOT_TIME' is not a procedure or is undefined ORA-06550: line 1, column 7:
-------------------------------------------
怎么回事,明明数据库有这个函数啊?
但是我在jdbc中这段代码确可以调用
-------------------------------------------
Class.forName("oracle.jdbc.driver.OracleDriver");
conn =DriverManager.getConnection("jdbc:oracle:thin:@111.111.111.111:1521:stat","pass","pass");



//conn = DBConnection.ins.getConn("jdbc/StatDB");sdf.format(new Date())+1
//conn = DBConnection.ins.getConn("statistic");

cs = conn.prepareCall("{? = call PCK_VIEW.F_GET_SITESNAPSHOT_TIME(?)}");
cs.registerOutParameter(1, OracleTypes.CURSOR);
cs.setString(2,"");
cs.execute();
rs =(ResultSet) cs.getObject(1);
--------------------------------------------