Sybase·调用存储过程并返回结果

最近项目要用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 	
as 

 

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语句很像

 

上一篇:Sybase中字符串替换函数 STR REPLACE


下一篇:sybase central 报 NullPointerException 解决