包括以下几个表:
楼栋表;楼层表;房间表;学员住宿表
脚本如下:
--楼栋表
CREATE TABLE [dbo].[CellInfo] (
[CellCode] [nvarchar] (8) COLLATE Chinese_PRC_CI_AS NOT NULL ,--楼栋编号(如:A栋、B栋)
[FloorNum] [int] NULL ,--楼层数
[DormManager] [nvarchar] (8) COLLATE Chinese_PRC_CI_AS NULL ,--该楼栋的管理员
[DormClass] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,--该楼栋的班级类别(男生、女生宿舍或男女混住)
) ON [PRIMARY]
GO
--楼层表
CREATE TABLE [dbo].[FloorInfo] (
[FloorId] [int] IDENTITY (1, 1) NOT NULL ,
[CellCode] [nvarchar] (8) COLLATE Chinese_PRC_CI_AS NULL ,--对应的楼栋
[FloorCode] [nvarchar] (8) COLLATE Chinese_PRC_CI_AS NULL ,--楼层
[DormNum] [int] NULL ,--房间的数量
[FloorType] [nvarchar] (8) COLLATE Chinese_PRC_CI_AS NULL ,--该楼栋层的班级类别(男生或女生宿舍)
[GUID] [nvarchar] (48) COLLATE Chinese_PRC_CI_AS NULL --标识列
) ON [PRIMARY]
GO
--房间表
CREATE TABLE [dbo].[DormInfo] (
[DormId] [int] IDENTITY (1, 1) NOT NULL ,
[GUID] [nvarchar] (48) COLLATE Chinese_PRC_CI_AS NULL ,--对应楼层的GUID
[DormCode] [nvarchar] (8) COLLATE Chinese_PRC_CI_AS NULL ,--寝室号
[DormMaster] [nvarchar] (8) COLLATE Chinese_PRC_CI_AS NULL ,--寝室长
[BedNum] [int] NULL ,--床位数量
[DormTel] [nvarchar] (13) COLLATE Chinese_PRC_CI_AS NULL ,--电话
) ON [PRIMARY]
GO
--学员住宿表
CREATE TABLE [dbo].[DormStudentInfo] (
[GUID] [nvarchar] (48) COLLATE Chinese_PRC_CI_AS NOT NULL ,--对应楼层的GUID
[DormCode] [nvarchar] (8) COLLATE Chinese_PRC_CI_AS NOT NULL ,--寝室号
[StudentId] [nvarchar] (16) COLLATE Chinese_PRC_CI_AS NULL , --学员
[BedCode] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NULL --床位
) ON [PRIMARY]
GO
--利用这几个表,给出GUID(对应某一楼栋的某一楼层),列出相应楼层的空房间(全空)以及空房间(半空)的空床位列表:
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
create proc SP_Select_FloorEmptyList
@GUID nvarchar(48)
as
select * into #temp from dbo.DormInfo where GUID = @GUID
select DormCode,BedNum into #temp1 from #temp where DormCode not in
(select DormCode from dbo.DormStudentInfo)
--空房间列表
select * from #temp1
select DormCode,BedNum,SN = BedNum -
(select count(*) from dbo.DormStudentInfo where DormStudentInfo.DormCode = #temp.DormCode),
DormTel into #temp2 from #temp where BedNum >
(select count(*) from dbo.DormStudentInfo where DormStudentInfo.DormCode = #temp.DormCode)
and DormCode not in (select DormCode from #temp1)
--update #temp2
--set DormTel = '81945842'
--where DormCode = 'B505'
--select * from #temp2
DECLARE EDcursor CURSOR FOR
SELECT DormCode,BedNum
FROM #temp2
--ORDER BY au_fname, au_lname
declare @DormCode nvarchar(8),@BedNum int,@ENumS nvarchar(13),@ENum nvarchar(10)
--set @ENumS = ''
OPEN EDcursor
FETCH NEXT FROM EDcursor into @DormCode,@BedNum
WHILE @@FETCH_STATUS = 0
BEGIN
set @ENumS = ''
DECLARE ENcursor CURSOR FOR select * from dbo.OrderNum where orderNum <= @BedNum and orderNum not in
(select BedCode from dbo.DormStudentInfo where DormCode = @DormCode)
open ENcursor
FETCH NEXT FROM ENcursor into @ENum
WHILE @@FETCH_STATUS = 0
BEGIN
--select @ENum =
if @ENumS = ''
set @ENumS = @ENum
else
set @ENumS = @ENumS + ',' + @ENum
FETCH NEXT FROM ENcursor into @ENum
END
update #temp2
set DormTel = @ENumS
where DormCode = @DormCode
CLOSE ENcursor
DEALLOCATE ENcursor
--DECLARE ENcursor CURSOR FOR select
FETCH NEXT FROM EDcursor into @DormCode,@BedNum
END
CLOSE EDcursor
DEALLOCATE EDcursor
--空床位列表
select * from #temp2
drop table #temp,#temp1,#temp2
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
分享到:
相关推荐
本示例提供了一个关于存储过程、异常处理、错误消息返回、游标嵌套及其相关问题解决的综合案例。通过这些知识点的学习,初学者可以更好地理解和掌握如何编写健壮、高效的数据库应用程序。同时,对于更高级的应用场景...
本篇将深入探讨SQL Server 2005中的存储过程、游标以及游标嵌套的综合应用。 存储过程(Stored Procedure)是预编译的SQL语句集合,它们封装了特定的功能,可以多次调用,提高了代码的复用性和执行效率。在SQL ...
MySQL 游标嵌套实践 本文档旨在介绍 MySQL 游标嵌套的概念和实践,通过对游标的嵌套使用,演示如何实现复杂的数据操作。 一、游标嵌套简介 游标(Cursor)是数据库中的一种控制结构,可以用来遍历查询结果集。...
SQL对游标嵌套的应用 学校宿舍管理系统(实际上是个子系统): 包括以下几个表: 楼栋表;楼层表;房间表;学员住宿表 脚本如下: --楼栋表
下面是一个订单取消的含2个游标的存储过程 set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER PROCEDURE [dbo].[CancelOrderBySystem] AS BEGIN declare /*声明变量*/ @Status varchar(100), –状态 ...
本示例中,我们将探讨如何在存储过程中循环内嵌套使用游标。 首先,我们看到声明了多个变量,如`v_addtime_begin`, `v_addtime_end`, `v_borrow_id`, `v_count`等,用于存储查询结果和控制循环。接着,声明了一个名...
完整的SQL SERVER双层游标嵌套示例
9. **避免游标嵌套**:尽量减少游标嵌套的深度,因为每一层嵌套都会增加额外的开销。 通过上述方法,可以在一定程度上优化Oracle游标的性能,从而提高应用程序的整体响应时间和资源利用率。需要注意的是,每种优化...
在处理游标嵌套时尤其需要注意这一点。有两种定义游标的常见方式: - 声明并处理`CONTINUE HANDLER`,例如在处理`NOT FOUND`条件时,可以保持游标开放,并使用`WITH HOLD`选项。这种方式允许在循环内使用`COMMIT`或...
10. **游标嵌套**:在更复杂的应用场景中,你可能需要在一个游标内部使用另一个游标,这被称为游标的嵌套,以处理多层关系的数据。 通过这个“PL/SQL语法参考实例”文档集,学习者可以找到各种实际例子,了解这些...
游标用于逐行处理结果集,其过程包括打开、使用和关闭,但不包括游标嵌套。 第七章讨论了索引,聚集索引的顺序与表记录物理顺序相同,索引的创建与优化是数据库性能的关键。适合建索引的列通常具有较高的查询频率,...
5. 使用游标处理结果集的基本过程不包括游标嵌套。正常流程包括打开游标、遍历数据、关闭游标和释放游标。 6. 监视SQL Server性能时,通常不关注打印速度,因为这与数据库性能优化无关。 7. 对于超大型数据库...
5. 使用游标处理结果集时,其基本过程不包括游标嵌套步骤。 知识点:游标管理、结果集处理 6. 监视 SQL Server 的性能对象时,通常不关注打印速度。 知识点:性能监控、打印速度 7. 分为多个文件的超大型数据库...
- **嵌套表游标**:返回嵌套表的游标。 - **Ref游标**:返回一个游标引用,可用于函数返回多个值的情况。 3. **FOR UPDATE 游标**:在查询结果上加上锁,以便后续更新数据。 4. **FOR DELETE 游标**:用于标记将要...
声明游标时可以使用简单的查询,也可以是复杂的连接查询或者嵌套查询。游标被声明后,必须先打开才能从中读取数据。读取数据时,可以逐行进行。操作完成后,需要关闭游标以释放系统资源,并且最后通过删除操作彻底...
除了基础的游标操作,MySQL还支持其他特性,如:嵌套游标(一个游标内部使用另一个游标)、可滚动游标(允许向前和向后移动)以及隐式游标(无需显式声明,常在存储过程中使用)。 在实际应用中,游标常常用于以下...
如果需要实现嵌套的游标循环,可以使用 BEGIN 和 END 语句来划分一个statement block,例如: DECLARE fetchSeqOk BOOLEAN; BEGIN DECLARE _seqname VARCHAR(50); DECLARE _value BIGINT(20); DECLARE ...
在PL/SQL块中,游标可以嵌套使用,用于处理复杂的业务逻辑。例如,你可以使用游标遍历表中的每一行,然后对每一行执行特定的操作,如更新另一张表的数据。 **游标优化**: 尽管游标提供了便利,但过度使用可能导致...
根据提供的标题、描述、标签及部分内容,我们可以总结出以下知识点: ### 游标与行转列操作 #### 1. 游标概述 ...同时,通过这种方式还可以学习如何利用嵌套循环和条件判断来处理复杂的业务逻辑问题。