数据库系统原理上机考试----关于游标
不要求复杂,调理清晰就行,太复杂考试时也不会!
考试时用的是sql2000
货车(货车编号,车牌,出场日期,司机,最大运输量)
司机(司机编号,姓名,联系方式,驾驶证日期)
货物(货物编号,货物名称,产地,单价,货物总量)
运输记录(运输单编号,货车编号,货物编号,运输量,交易类型,运输日期)
1.修改货物表,调整总量超过350000的货物单价为原来的90%
2.找出运输过所有货物的司机
[解决办法]
--1.修改货物表,调整总量超过350000的货物单价为原来的90% update 货物 set 单价=0.9*单价 where 货物总量>3500002.找出运输过所有货物的司机 select b.司机编号, b.姓名 from 货车 a inner join 司机 b on a.司机=b.司机编号 where a.货车编号 in (select 货车编号 from 运输记录 group by 货车编号 having count(distinct 货物编号)=(select count(货物编号) from 货物编号))
[解决办法]
游標1.修改货物表,调整总量超过350000的货物单价为原来的90%DECLARE cur CURSOR LOCAL FORSELECT 货物编号,货物总量 FROM 货物表DECLARE @货物编号 NVARCHAR(50),@货物总量 INTOPEN curFETCH NEXT FROM cur INTO @货物编号,@货物总量WHILE @@FETCH_STATUS=0BEGIN IF @货物总量>350000 UPDATE 货物表 SET 单价=单价*0.9 WHERE 货物编号=@货物编号 FETCH NEXT FROM cur INTO @货物编号,@货物总量ENDCLOSE curDEALLOCATE cur
[解决办法]
2.找出运输过所有货物的司机DECLARE @T TABLE(司机编号 NVARCHAR(50),姓名 NVARCHAR(50))DECLARE cur2 CURSOR LOCAL FORSELECT 司机编号,姓名 FROM 司机DECLARE @司机编号 NVARCHAR(50),@姓名 NVARCHAR(50)OPEN cur2FETCH NEXT FROM cur2 INTO @司机编号,@姓名WHILE @@FETCH_STATUS=0BEGIN IF NOT EXISTS(SELECT 1 FROM 货物 AS x WHERE NOT EXISTS(SELECT 1 FROM 货车表 AS a INNER JOIN 运输记录表 AS b ON a.货车编号=b.货车编号 AND a.出场日期=b.出场日期 WHERE b.货物编号=x.货物编号)) INSERT INTO @T ( 司机编号, 姓名 ) VALUES ( @司机编号, -- 司机编号 - nvarchar(50) @姓名 -- 姓名 - nvarchar(50) ) FETCH NEXT FROM cur2 INTO @司机编号,@姓名ENDCLOSE cur2DEALLOCATE cur2SELECT * FROM @T