最近项目要用Sybase数据库实现分页,第一次使用Sybase数据库,也是第一次使用他的存储过程。2个多小时才调用成功,在此记录:
项目架构:SSM
1、Sybase本身不支持分页操作,需要写存储过程来调用,这是很坑的。存储过程的内容暂且放下,
存储过程名:query_xxx_record_detail
输入输出参数如下:9个输入,5个输出
--input
@terminal_no varchar(16),
@account_no varchar(16),
@begin_time char(14),
@end_time char(14),
@query_type varchar(1), ---0:query all 1:paging
@count_per_page Integer = 10,
@start_page_num Integer = 1,
@page_count Integer = 1,
@timestamp char(19),
--output
@total_pages integer output,
@total_records varchar(8) output,
@total_amount varchar(14) output,
@return_code char(4) output,
@error_msg varchar(255) output
2、在业务层整理参数:
注意:在使用map携带参数时,只需要传入input参数。。9个
Map<String,Object> queryMap = new HashMap<String, Object>();
//调用存储过程:
queryMap.put("terminal_no",terminalNo);
queryMap.put("account_no", accountNo);
queryMap.put("begin_time", beginTime);
queryMap.put("end_time", endTime);
queryMap.put("query_type", type);
queryMap.put("count_per_page", pageRecordCountNo);
queryMap.put("start_page_num", beginPageNo);
queryMap.put("page_count",pageCountNo);
//使用list得到返回值,是存储过程中的sql决定的。这个跟其他的select一样可以封装
List<MposRecord> queryResult = mapper.queryPospMposRecordDetail(queryMap);
3、在mapper中方法:
* 调用存储过程返回分页结果
* @param queryMap
* @return
List<MposRecord> queryPospMposRecordDetail(Map<String, Object> queryMap);
4、在xml文件中:
<select id="queryPospMposRecordDetail" statementType="CALLABLE" parameterMap="queryDetailMap" resultType="java.util.Map">
<![CDATA[{call query_xxx_record_detail (?,?,?,?,?,?,?,?,?, ?,?,?,?)}]]>
</select>
<parameterMap type="java.util.Map" id="queryDetailMap">
<parameter property="terminal_no" mode="IN" jdbcType="VARCHAR"/>
<parameter property="account_no" mode="IN" jdbcType="VARCHAR"/>
<parameter property="begin_time" mode="IN" jdbcType="CHAR"/>
<parameter property="end_time" mode="IN" jdbcType="CHAR"/>
<parameter property="query_type" mode="IN" jdbcType="VARCHAR"/>
<parameter property="count_per_page" mode="IN" jdbcType="INTEGER"/>
<parameter property="start_page_num" mode="IN" jdbcType="INTEGER"/>
<parameter property="page_count" mode="IN" jdbcType="INTEGER"/>
<parameter property="total_pages" mode="OUT" jdbcType="INTEGER"/>
<parameter property="total_records" mode="OUT" jdbcType="VARCHAR"/>
<parameter property="total_amount" mode="OUT" jdbcType="VARCHAR"/>
<parameter property="return_code" mode="OUT" jdbcType="CHAR"/>
<parameter property="error_msg" mode="OUT" jdbcType="VARCHAR"/>
</parameterMap>
<parameter property="total_pages" mode="OUT" jdbcType="INTEGER"/>
<parameter property="total_records" mode="OUT" jdbcType="VARCHAR"/>
<parameter property="total_amount" mode="OUT" jdbcType="VARCHAR"/>
<parameter property="return_code" mode="OUT" jdbcType="CHAR"/>
<parameter property="error_msg" mode="OUT" jdbcType="VARCHAR"/>
</parameterMap>
1.statementType="CALLABLE"
2.占位符:9个传入参数,5个返回参数都需要占位符
3.参数列表:传入参数和返回参数:用mode属性分开。
总结:调用存储过程基本没啥区别,包括返回值跟其他select语句也基本一致,可以返回用来封装的bean或者list,可以返回string或者map。这是在写xml文件的时候要注意有些不一样的。
主要还是最后的xml文件写法,跟一般的数据库sql语句很像
列:STUDENT_ID, NAME, AGE, SEX,TEACHER_ID
表:teacher
列:TEACHER_ID,NAME,AGE,SEX,SALARY,STUDENT_NUM
需求:将性别和年龄符合给定条件的学生,都指派给指定的老师,并将学生的数量,更新到teacher表中。
业务成功,则返回学生的数量,否则返回-1。
存储过程的代码:
create procedure dbo.QueryPageList
@sqlStr varchar(8000), --sql语句 select id,name from t1
@start int, -- 从那行开始(偏移量)
@limit int -- 每页数量大小
DECLA
Sybase的存储过程是集中存储在SQL Server中的预先定义且已经编译好的事务。存储过程由SQL语句和流程控制语句组成。它的功能包括:接受参数;调用另一过程;返回一个状态值给调用过程或批处理,指示调用成功或失败;返回若干个参数值给调用过程或批处理,为调用者提供动态结果;在远程SQL Server中运行等。
存储过程的性能特点如下:
·存储过程是预编译过的,这就意味着...
/* 定义输入参数 orderno , 输出参数 @oc_list*/
create procedure p_get_oclist_with_itemnumber
(@orderno varchar(30),@oc_list varchar(255) output)
declare