java调用存储过程返回map组装List(含SqlServer存储过程)
- 格式:docx
- 大小:17.91 KB
- 文档页数:6
sqlserver存储过程调试方法SQL Server是一种常用的关系型数据库管理系统,它提供了存储过程的功能,可以在数据库中存储一段预编译的SQL代码,并在需要时进行调用。
存储过程通常用于执行复杂的数据库操作,提高数据库的性能和安全性。
在开发和调试存储过程时,我们需要一些方法来验证和调试代码的正确性。
本文将介绍一些常用的SQL Server 存储过程调试方法。
1. 使用PRINT语句输出调试信息在存储过程中,可以使用PRINT语句输出一些调试信息,例如变量的值、执行的步骤等。
通过在关键位置添加PRINT语句,可以观察存储过程执行过程中的中间结果,从而验证代码的正确性。
例如:```PRINT '开始执行存储过程'PRINT '变量@x的值为:' + CONVERT(VARCHAR(10), @x)```2. 使用SELECT语句输出结果集在存储过程中,可以使用SELECT语句返回结果集。
通过在存储过程中添加SELECT语句,可以观察查询结果并验证代码的正确性。
例如:```SELECT * FROM 表名 WHERE 条件```3. 使用TRY...CATCH块捕获异常在存储过程中,可以使用TRY...CATCH块来捕获异常并处理错误。
通过在TRY块中执行代码,在CATCH块中处理异常信息,可以更好地调试存储过程并处理潜在的错误。
例如:```BEGIN TRY-- 执行代码END TRYBEGIN CATCH-- 处理异常END CATCH```4. 使用SET NOEXEC语句暂停执行在存储过程中,可以使用SET NOEXEC语句来暂停执行。
通过在存储过程中添加SET NOEXEC语句,并将其设置为ON或OFF,可以控制存储过程的执行。
例如:```SET NOEXEC ON -- 暂停执行SET NOEXEC OFF -- 恢复执行```5. 使用SET SHOWPLAN_ALL语句显示执行计划在存储过程中,可以使用SET SHOWPLAN_ALL语句来显示执行计划。
在易语⾔中调⽤MSSQLSERVER数据库存储过程(Transact-SQL)⽅法总结作者:liigo⽇期:2010/8/25 Microsoft SQL SERVER 数据库存储过程,根据其输⼊输出数据,笼统的可以分为以下⼏种情况或其组合:⽆输⼊,有⼀个或多个输⼊参数,⽆输出,直接返回(return)⼀个值,通过output参数返回⼀个或多个值,返回⼀个记录集(recordset)。
⽆论哪⼀种情况,⽆论输⼊输出参数多复杂的存储过程,都可以在易语⾔中正确调⽤,准确的传⼊参数,并获取正确的输出数据。
下⾯我(liigo)分多种情况介绍在易语⾔中调⽤MS SQL SERVER数据库存储过程的详细⽅法,使⽤数据库操作⽀持库(eDatabase.fne)。
此前多有⼈说易语⾔⽆法调⽤数据库存储过程,或咨询调⽤存储过程的⽅法,因成此⽂。
⼀、调⽤“⽆输⼊输出数据”的存储过程 这是最简单的情况,执⾏⼀个简单的SQL语句就OK了,下⾯直接给出代码:数据库连接1.执⾏SQL (“exec dbproc”) 其中,“数据库连接1”是数据库操作⽀持库中“数据库连接”控件的实例,"exec" 表⽰调⽤存储过程,"dbproc"为被调⽤的存储过程的名称。
即使存储过程有返回值,在不想接收返回值的情况下,也可按这种⽅法调⽤。
⼆、调⽤“有⼀个或多个输⼊参数”的存储过程 ⼀个输⼊参数的情况(其中5为参数值,跟在存储过程名称之后,以空格分隔):数据库连接1.执⾏SQL (“exec dbproc_p1 5”) 两个输⼊参数的情况(其中3和6为参数值,之间以逗号分隔):数据库连接1.执⾏SQL (“exec dbproc_p2 3,6”)三、调⽤“返回记录集(recordset)”的存储过程 存储过程最后⼀条SQL语句为Select语句,通常将返回⼀个记录集(recordset)给调⽤者。
在易语⾔中,可通过数据库操作⽀持库中的“记录集”控件接收该记录集,具体代码如下图:易语⾔调⽤MSSQL存储过程 核⼼代码就是中间淡黄底⾊加亮的那⼀⾏(记录集1.打开),这⾏代码执⾏成功后,记录集1内容就是存储过程返回的recordset内容,通过⼀个简单的循环语句可以遍历所有记录。
sqlserver 存储过程循环table -回复在SQL Server中,存储过程是一组预编译的SQL语句的集合,它们可以被封装为一个单一的单元并在需要时被多次调用。
存储过程允许我们在数据库中执行一系列操作,并且可以接受参数来进行个性化的处理。
然而,有时候我们需要在存储过程中循环执行某个操作,这个操作可能需要针对一个表中的每一行执行,或者需要在某个条件为真时重复执行。
在这篇文章中,我们将探讨如何在SQL Server的存储过程中实现循环表操作。
首先,让我们考虑一个例子,假设我们有一张名为`Employee`的表,它包含员工的姓名和薪水两列。
我们想要编写一个存储过程,用于将每个员工的薪水增加10。
首先,我们需要创建一个存储过程来执行这个操作。
可以使用以下代码创建这个存储过程:sqlCREATE PROCEDURE IncreaseSalaryASBEGIN待填写的代码END接下来,我们需要在存储过程中使用循环来遍历`Employee`表中的每一行,并对薪水进行增加。
在SQL Server中,可以使用游标来实现这个目标。
游标是一种特殊的数据库对象,用于从结果集中逐行读取数据。
我们可以在存储过程中声明一个游标,并使用`OPEN`语句将其与查询结果关联起来。
然后,可以使用`FETCH NEXT`语句从游标中获取下一行数据。
在我们的例子中,我们将使用游标来遍历`Employee`表。
以下是将游标与查询结果集关联的代码示例:sqlDECLARE @EmployeeName VARCHAR(50)DECLARE @Salary DECIMAL(18,2)DECLARE employee_cursor CURSOR FORSELECT EmployeeName, SalaryFROM EmployeeOPEN employee_cursor接下来,我们需要使用`FETCH NEXT`语句从游标中获取下一行数据,并在每次循环中执行相应的操作。
一些用在SQL 2000的企业管理GUI中,并且不打算用于其他的流程。
微软已预计将其中的一些存储过程从未来的SQL Server版本中删除(或已经删除了)。
虽然这些存储过程可能很有用并为你节省了很多时间,但是他们可以在任何时候改变他们的函数或简单的删除掉。
下面的图表显示了当许多存储过程从一个Microsoft SQL Server版本移入另一个版本时,引入了新的存储过程,而原来的一些则从安装包里删除了。
大多数的存储过程,如果不是所有的,要求用户是系统管理员服务器角色以便执行这些存储过程。
和文件系统交互的存储过程还要求执行存储过程的用户(还有SQL Server的服务帐户)具有访问文件/文件夹的权限。
sp_executeresultset微软在SQL Server 2005中删除了这个名为sp_executeresultset的便利小程序。
它允许你在空闲时通过使用SELECT查询产生动态SQL代码。
然后,作为结果的SQL命令将会在数据库上执行。
它允许你创建单独的一行代码,这行代码可以在单步中查询到你的数据库里的每一个表的记录数目(就像例子中所显示的)。
这是一个未公开的存储过程,而且无法知道它为什么被删除了。
但是,唉,这个便利的有用存储过程已经没有了。
exec sp_execresultset 'SELECT ''SELECT '''''' + name + '''''',count(*) FROM '' + namefrom sysobjectswhere xtype = ''U'''sp_MSforeachdb / sp_MSforeachtablesp_MSforeachdb / sp_MSforeachtable两个存储过程,sp_MSforeachdb和sp_MSforeachtable封装了一个指针。
mybatis查询返回List集合、map集合、List<Map>集合返回map类型1. xml中<select id="selectUser" resultType="java.util.HashMap"></select>2.Dao接⼝中Map<String,Object> selectUser();这种⽅式SQL只能返回⼀⾏记录或者没有返回,如果返回多⾏记录,则程序报错。
返回List<String>类型3. xml中<select id="selectUser" resultType="ng.String"></select>2.Dao接⼝中List<String> selectUser();这种⽅式可以返回多⾏记录,但是每⾏记录只有指定的⼀列数据。
返回List<Map>类型1.xml中<select id="selectUser" resultType="java.util.HashMap"></select>2.Dao接⼝中List<Map<String,Object>> selectUser ();这种⽅式可以返回指定的多⾏多列的记录。
返回List<指定对象>类型xml中:<resultMap id="baseResult" type="com.XXX.BscntrUnitInfoResult(对应对象)"><result column="unit_id" property="unitId" jdbcType="INTEGER" (字段映射关系)/><result column="unit_name" property="unitName"jdbcType="VARCHAR" /><result column="unit_type" property="unitType"jdbcType="INTEGER" /><result column="super_unit_id" property="superUnitId"jdbcType="INTEGER" /><result column="gis_start_x" property="gisStartX"jdbcType="FLOAT" /><result column="ext_top" property="extTop" jdbcType="DOUBLE" /></resultMap><select id="getBscntrUnitInfoListByName" resultMap="baseResult"></select>Dao接⼝中:public List<BscntrUnitInfoResult> getBscntrUnitInfoListByName();。
listbymap用法ListByMap用法详解ListByMap是一种常用的Java集合类,它可以将Map中的键值对转换为List中的元素。
在实际开发中,我们经常需要将Map中的数据转换为List,以便于进行排序、过滤、分页等操作。
ListByMap 就是为了解决这个问题而设计的。
ListByMap的使用方法非常简单,只需要调用它的静态方法listByMap即可。
该方法接受一个Map类型的参数,返回一个List 类型的结果。
下面是一个简单的示例:```Map<String, Integer> map = new HashMap<>();map.put("apple", 10);map.put("banana", 20);map.put("orange", 30);List<Map.Entry<String, Integer>> list = ListByMap.listByMap(map); ```上面的代码中,我们创建了一个Map对象,并向其中添加了三个键值对。
然后调用ListByMap的listByMap方法,将Map对象转换为List对象。
最终得到的List对象中包含了三个Map.Entry类型的元素,每个元素表示一个键值对。
ListByMap的返回结果是一个List<Map.Entry<K, V>>类型的对象,其中K表示键的类型,V表示值的类型。
List中的元素是按照Map 中的键值对顺序排列的。
如果需要按照值的大小进行排序,可以使用Collections.sort方法进行排序。
ListByMap还支持过滤操作。
可以通过传递一个Predicate对象来过滤List中的元素。
下面是一个示例:```Map<String, Integer> map = new HashMap<>();map.put("apple", 10);map.put("banana", 20);map.put("orange", 30);List<Map.Entry<String, Integer>> list = ListByMap.listByMap(map, entry -> entry.getValue() > 15);```上面的代码中,我们创建了一个Map对象,并向其中添加了三个键值对。
mybatis调⽤存储过程参数形式:Sql代码1. create procedure sptest.adder(in addend1 integer, in addend2 integer, out theSum integer)2. begin atomic3. set theSum = addend1 + addend2;4. end5. goXml代码1. <parameterMap type="map" id="testParameterMap">2. <parameter property="addend1" jdbcType="INTEGER" mode="IN"/>3. <parameter property="addend2" jdbcType="INTEGER" mode="IN"/>4. <parameter property="sum" jdbcType="INTEGER" mode="OUT"/>5. </parameterMap>6. lt;update id="adderWithParameterMap" parameterMap="testParameterMap" statementType="CALLABLE">7. {call sptest.adder(?, ?, ?)}8. </update>Java代码1. public void testAdderAsUpdateWithParameterMap() {2. SqlSession sqlSession = sqlSessionFactory.openSession();3. try {4. Map<String, Object> parms = new HashMap<String, Object>();5. parms.put("addend1", 3);6. parms.put("addend2", 4);7.8. SPMapper spMapper = sqlSession.getMapper(SPMapper.class);9.10. spMapper.adderWithParameterMap(parms);11. assertEquals(7, parms.get("sum"));12.13. parms = new HashMap<String, Object>();14. parms.put("addend1", 2);15. parms.put("addend2", 3);16. spMapper.adderWithParameterMap(parms);17. assertEquals(5, parms.get("sum"));18.19. } finally {20. sqlSession.close();21. }带输⼊输出参数的存储过程:sql代码:Sql代码1. create procedure sptest.getnames(in lowestId int, out totalrows integer)2. reads sql data3. dynamic result sets 14. BEGIN ATOMIC5. declare cur cursor for select * from s where id >= lowestId;6. select count(*) into totalrows from s where id >= lowestId;7. open cur;8. END9. goXml代码1. <select id="getNamesAndItems" statementType="CALLABLE"2. <select id="getNames" parameterType="java.util.Map" statementType="CALLABLE"3. resultMap="nameResult">4. {call sptest.getnames(5. #{lowestId,jdbcType=INTEGER,mode=IN},6. #{totalRows,jdbcType=INTEGER,mode=OUT})}7. </select>8. </select>Java代码1. public void testCallWithResultSet2_a1() {2. SqlSession sqlSession = sqlSessionFactory.openSession();3. try {4. SPMapper spMapper = sqlSession.getMapper(SPMapper.class);5.6. Map<String, Object> parms = new HashMap<String, Object>();7. parms.put("lowestId", 1);8. List<Name> names = spMapper.getNamesAnnotated(parms);9. assertEquals(3, names.size());10. assertEquals(3, parms.get("totalRows"));11. } finally {12. sqlSession.close();13. }14. }返回多个结果集sql代码:Sql代码1. create procedure sptest.getnamesanditems()2. reads sql data3. dynamic result sets 24. BEGIN ATOMIC5. declare cur1 cursor for select * from s;6. declare cur2 cursor for select * from sptest.items;7. open cur1;8. open cur2;9. END10. goXml代码1. <resultMap type="" id="nameResult">2. <result column="ID" property="id"/>3. <result column="FIRST_NAME" property="firstName"/>4. <result column="LAST_NAME" property="lastName"/>5. </resultMap>6.7. <resultMap type="org.apache.ibatis.submitted.sptests.Item" id="itemResult">8. <result column="ID" property="id"/>9. <result column="ITEM" property="item"/>10. </resultMap>11.12. <select id="getNamesAndItems" statementType="CALLABLE"13. resultMap="nameResult,itemResult">14. {call sptest.getnamesanditems()}15. </select>Java代码1. @Test2. public void testGetNamesAndItems() throws SQLException {3. SqlSession sqlSession = sqlSessionFactory.openSession();4. try {5. SPMapper spMapper = sqlSession.getMapper(SPMapper.class);6.7. List<List<?>> results = spMapper.getNamesAndItems();8. assertEquals(2, results.size());9. assertEquals(4, results.get(0).size());10. assertEquals(3, results.get(1).size());11. } finally {12. sqlSession.close();13. }14. }注意:上⾯就是⼏种常⽤的了。
SQLSERVER存储过程的操作与管理SQL Server 存储过程是一组预编译的SQL语句块,经过编译和存储在数据库服务器中以便反复使用。
存储过程可以接收参数并返回结果,可以实现复杂的逻辑处理,并且可以提高数据库的性能和安全性。
在本文中,我们将详细介绍SQL Server存储过程的操作与管理。
创建存储过程:在SQL Server中,创建存储过程使用CREATE PROCEDURE语句。
例如,以下是一个简单的创建存储过程的示例:```CREATE PROCEDURE sp_GetCustomersASBEGINSELECT * FROM CustomersEND```在这个例子中,我们创建了一个名为sp_GetCustomers的存储过程,它从Customers表中检索所有客户的数据。
执行存储过程:要执行存储过程,可以使用EXECUTE或EXEC语句,例如:```EXEC sp_GetCustomers```当我们执行存储过程sp_GetCustomers时,它将返回Customers表中的所有客户数据。
存储过程参数:存储过程可以接收参数来实现更加灵活和可复用的逻辑处理。
以下是一个带有参数的存储过程的示例:```CREATE PROCEDURE sp_GetCustomerByIdASBEGINEND```在这个例子中,我们创建了一个名为sp_GetCustomerById的存储过程,它接收一个整数类型的CustomerId参数,并根据该参数从Customers表中检索客户数据。
执行带参数的存储过程:要执行带参数的存储过程,可以在EXECUTE或EXEC语句后传递参数的值,例如:``````当我们执行存储过程sp_GetCustomerById,并传递CustomerId参数为1时,它将返回CustomerId为1的客户数据。
存储过程的输入输出参数:除了普通参数外,存储过程还可以具有输入输出参数。
Hibernate调用存储过程传参获取返回值简介Hibernate是一个流行的Java持久化框架,它提供了一种将Java对象映射到关系型数据库的方式。
在某些情况下,我们可能需要调用存储过程来执行一些复杂的数据库操作。
本文将介绍如何使用Hibernate调用存储过程,并传递参数和获取返回值。
准备工作在开始之前,我们需要完成以下准备工作:1.安装Java JDK和Hibernate框架。
2.配置Hibernate的数据库连接信息,包括数据库驱动、URL、用户名和密码等。
3.创建数据库存储过程,并确保它已经在数据库中正确地定义和测试。
Hibernate映射文件在使用Hibernate调用存储过程之前,我们需要创建一个Hibernate映射文件来定义存储过程的调用。
下面是一个示例的映射文件:<hibernate-mapping><sql-query name="callStoredProcedure" callable="true">{ call my_stored_procedure(:param1, :param2) }</sql-query></hibernate-mapping>在上面的示例中,我们定义了一个名为”callStoredProcedure”的SQL查询,其中”callable”属性被设置为”true”,表示这是一个调用存储过程的查询。
存储过程的调用语法是{ call procedure_name(:param1, :param2) },其中”:param1”和”:param2”是存储过程的输入参数。
调用存储过程一旦我们有了Hibernate映射文件,我们就可以在Java代码中使用Hibernate来调用存储过程。
下面是一个示例代码:Session session = HibernateUtil.getSessionFactory().getCurrentSession(); Transaction tx = session.beginTransaction();Query query = session.getNamedQuery("callStoredProcedure");query.setParameter("param1", value1);query.setParameter("param2", value2);query.executeUpdate();mit();在上面的示例中,我们首先获取Hibernate的Session对象,并开启一个事务。
Action层 public ActionForward getProjectPayMoneyJsonByPayType(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { JiLiangZhiFuService jiLiangZhiFuService = this.getServiceLocator().getJiLiangZhiFuService(); int year = Integer.parseInt(request.getParameter("year")); String data = jiLiangZhiFuService.getProjectPayMoneyJsonByPayType(year); response.setContentType("text/xml"); response.getWriter().write(data); response.getWriter().flush(); response.getWriter().close(); return null; }
Service层 public String getProjectPayMoneyJsonByPayType(int year){ double allTotal = 0; Map map = jiLiangZhiFuDao.getProjectPayMoneyByPayType(year); List dataItemList = SessionBean.getServiceLocator().getDataItemService().getAllDataItemByTypeId("payType"); Map map_ep = new HashMap(); map_ep.put("account_id", 2); map_ep.put("isSelectTwoStageProject", true); List engineeringPhaseList = SessionBean.getServiceLocator().getEngineeringPhaseService().getEngineeringPhaseList(map_ep).getData(); Map map_type = new HashMap(); StringBuilder sb = new StringBuilder(); sb.append(""+engineeringPhaseList.size()+""); for(EngineeringPhase engineeringPhase:engineeringPhaseList){ String ep_id = engineeringPhase.getEp_id(); sb.append(""); sb.append(""+ep_id+""); sb.append(""+engineeringPhase.getEp_name()+""); for(DataItem dataItem:dataItemList){ String di_id = dataItem.getId(); String r_key = ep_id + "," + di_id; if(map.containsKey(r_key)){ map_type.put(di_id, map_type.containsKey(di_id) ? (Double.parseDouble(map_type.get(di_id).toString()) + Double.parseDouble(map.get(r_key).toString())) : Double.parseDouble(map.get(r_key).toString())); sb.append("<"+di_id+">"+map.get(r_key)+""); } } //项目支付金额合计 sb.append(""+map.get(engineeringPhase.getEp_id())+""); allTotal += Double.parseDouble(map.get(engineeringPhase.getEp_id()).toString()); sb.append(""); } //某支付类别金额合计 sb.append(""); sb.append(""); sb.append("合计"); DecimalFormat df = new DecimalFormat("#.00"); for(DataItem dataItem:dataItemList){ sb.append("<"+dataItem.getId()+">"+String.format("%.2f", map_type.get(dataItem.getId()))+""); } //各项目累计合计 sb.append(""+String.format("%.2f", allTotal)+""); sb.append(""); sb.append(""); return sb.toString(); }
Dao层 public Map getProjectPayMoneyByPayType(final int year) { try { return (Map)this.getHibernateTemplate().execute( new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { Connection con = session.connection(); Statement stmt = con.createStatement(); CallableStatement cs = con.prepareCall("{call proc_records(?)}"); cs.setInt(1, year); //ResultSet rs = stmt.executeQuery("{call proc_records}"); ResultSet rs = cs.executeQuery(); Map map = new HashMap(); while (rs.next()) { map.put(rs.getString(1), rs.getString(2)); } rs.close(); stmt.close(); return map; } } ); } catch ( org.springframework.dao.DataAccessException e) { throw new DataAccessException(e.getMessage(),e); } }
Sql: create procedure proc_records @year int as DECLARE @map_table table(r_key varchar(100),r_value varchar(50)) DECLARE @type_id varchar(40) DECLARE @type_name varchar(50) DECLARE @project_id varchar(40) DECLARE @project_name varchar(50) DECLARE @payTypeMoney numeric(16, 2) DECLARE @sumPayTypeMoney numeric(16, 2)
BEGIN set @payTypeMoney = 0 set @sumPayTypeMoney = 0 --查询项目列表 DECLARE project_cursor CURSOR for select ep_id,ep_name from AB_engineeringPhase where account_id='2' open project_cursor fetch next from project_cursor into @project_id,@project_name while @@FETCH_STATUS = 0 begin --查询项目支付类别 DECLARE projectType_cursor CURSOR for select id,name from T_DataItem where typeId = 'payType' order by sort asc open projectType_cursor fetch next from projectType_cursor into @type_id,@type_name while @@FETCH_STATUS = 0 begin --业务逻辑处理处理内层游标 --获取一个项目某一项支付类型的数据 --查询一个项目某一支付类别金额 select @payTypeMoney = sum(checkProjectPayMoney) from JiLiangZhiFu where projectId = @project_id and payType = @type_id and enterDate > CAST(@year as varchar(4)) and enterDate < CAST(@year+1 as varchar(4)) and type = 'outer' group by payType