Sybase·调用存储过程并返回结果
最近项目要用Sybase数据库实现分页,第一次使用Sybase数据库,也是第一次使用他的存储过程。2个多小时才调用成功,在此记录:
项目架构:SSM
1、Sybase本身不支持分页操作,需要写存储过程来调用,这是很坑的。存储过程的内容暂且放下,
存储过程名:query_xxx_record_detail
输入输出参数如下:9个输入,5个输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | --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个
1 2 3 4 5 6 7 8 9 10 | 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);<br><br> //使用list得到返回值,是存储过程中的sql决定的。这个跟其他的select一样可以封装<br><br>List<MposRecord> queryResult = mapper.queryPospMposRecordDetail(queryMap); |
3、在mapper中方法:
1 2 3 4 5 6 7 | /** * 调用存储过程返回分页结果 * @param queryMap * @return */ List<MposRecord> queryPospMposRecordDetail(Map<String, Object> queryMap); |
4、在xml文件中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <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语句很像
凡你能说的,你说清楚。凡你不能说的,留给沉默!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· 程序员常用高效实用工具推荐,办公效率提升利器!
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 【译】WinForms:分析一下(我用 Visual Basic 写的)