1. 程式人生 > >Sybase呼叫儲存過程並返回結果

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<MposRecord> queryResult = mapper.queryPospMposRecordDetail(queryMap);//使用list得到返回值,是儲存過程中的sql決定的。這個跟其他的select一樣可以封裝

3、在mapper中方法:

/**
	 * 呼叫儲存過程返回分頁結果
	 * @param queryMap
	 * @return
	 */
	List<MposRecord> queryPospMposRecordDetail(Map<String, Object> queryMap);

4、在xml檔案中:
	//簡單的select寫法,但是注意在sybase中:呼叫儲存過程需要加CDATA符號
<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>
	
	
注意:

1.statementType="CALLABLE"

2.佔位符:9個傳入引數,5個返回引數都需要佔位符

3.引數列表:傳入引數和返回引數:用mode屬性分開。

總結:呼叫儲存過程基本沒啥區別,包括返回值跟其他select語句也基本一致,可以返回用來封裝的bean或者list,可以返回string或者map。這是在寫xml檔案的時候要注意有些不一樣的。

主要還是最後的xml檔案寫法,跟一般的資料庫sql語句很像