【SQL开源代码栏目提醒】:网学会员SQL开源代码为您提供CH20.sql参考,解决您在CH20.sql学习中工作中的难题,参考学习。
USE 练习02
-- P20-2
BEGIN TRAN -- 开始交易
UPDATE 物品管理
SET 数量 = 数量 + 1
WHERE 部门 = '业务部' AND 物品 = '办公桌'
IF @@ERROR > 0 OR @@ROWCOUNT <> 1
GOTO NeedRollBack
UPDATE 物品管理
SET 数量 = 数量 - 1
WHERE 部门 = '财务部' AND 物品 = '办公桌'
NeedRollBack:
IF @@ERROR > 0 OR @@ROWCOUNT <> 1
ROLLBACK TRAN -- 取消并回复交易
ELSE
COMMIT TRAN -- 确认交易
SELECT * FROM 物品管理
WHERE 物品 = '办公桌'
-- P20-8
UPDATE 物品管理
SET 数量 = 数量 - 10
-- P20-10
CREATE PROC TestTRAN
AS BEGIN TRAN
SELECT 书籍名称
FROM 书籍
ROLLBACK
GO
BEGIN TRAN
EXEC TestTRAN
ROLLBACK
-- P20-12
CREATE PROC 物品转移
@物品 varchar(20),
@来源部门 varchar(20),
@目的部门 varchar(20),
@数量 int
AS
BEGIN TRAN
UPDATE 物品管理
SET 数量 = 数量 + @数量
WHERE 部门 = @目的部门 AND 物品 = @物品
IF @@ERROR > 0 OR @@ROWCOUNT <> 1
GOTO NeedRollBack
UPDATE 物品管理
SET 数量 = 数量 - @数量
WHERE 部门 = @来源部门 AND 物品 = @物品
NeedRollBack:
IF @@ERROR > 0 OR @@ROWCOUNT <> 1
BEGIN
IF @@TRANCOUNT = 1
ROLLBACK TRAN
ELSE
COMMIT TRAN
RETURN 1
END
ELSE
BEGIN
COMMIT TRAN
RETURN 0
END
-- P20-14
DECLARE @ret int
BEGIN TRAN
EXEC @ret = 物品转移 '会议桌','业务部','生产部',2
IF @ret = 0
EXEC @ret = 物品转移 '办公桌','财务部','业务部',2
IF @ret = 0
COMMIT TRAN
ELSE
ROLLBACK TRAN
-- P20-18
SET XACT_ABORT ON
BEGIN DISTRIBUTED TRAN
INSERT 客户 (客户名称, 联络人)
VALUES ('好读书店', '陈大大')
IF @@ERROR <> 0 GOTO ERRORPROC
INSERT FLAG.练习02.dbo.客户 (客户名称, 联络人)
VALUES ('好读书店', '陈大大')
ERRORPROC:
IF @@ERROR <> 0
ROLLBACK
ELSE
COMMIT TRAN
-- P20-22
CREATE PROC GetAvgPriceDiff
AS
DECLARE @avg1 money, @avg2 money
SELECT @avg1 = AVG(价格)
FROM 旗旗公司
WHERE 产品名称 IN ('Windows 使用手册', 'Linux 架站实务')
SELECT @avg2 = AVG(价格)
FROM 标标公司
WHERE 产品名称 IN ('Windows 使用手册', 'Linux 架站实务')
PRINT '平均价格:旗旗='+CAST(@avg1 AS VARCHAR)
+' 标标='+CAST(@avg2 AS VARCHAR)
RETURN @avg1 - @avg2
GO
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
SET NOCOUNT ON
DECLARE @diff money
BEGIN TRAN
EXEC @diff = GetAvgPriceDiff
UPDATE 旗旗公司
SET 价格 = 价格 - (@diff/2)
WHERE 产品名称 IN ('Windows 使用手册', 'Linux 架站实务')
UPDATE 标标公司
SET 价格 = 价格 + (@diff/2)
WHERE 产品名称 IN ('Windows 使用手册', 'Linux 架站实务')
IF @@ERROR <> 0
ROLLBACK
ELSE
BEGIN
EXEC @diff = GetAvgPriceDiff
COMMIT
END
GO