实验四 SJK存储过程实验

实验题目

实验四 SJK存储过程实验

实验时间

2023.4.5

实验地点

软件工程基础实验室

实验课时

2

实验目的

​掌握存储过程的编写与调用

实验要求

​掌握存储过程的编写;掌握存储过程的调用

实验步骤

及内

 1.使用事务方式往院系表(t_department)中添加院系信息。信息分别为:(1)04,电器工程系,伏特;(2)04,机械工程系,墨子。要求两条记录同时添加,若错误则回滚,最后查询当前院系表中的数据信息。注意要查看输出的结果信息和消息信息。

参考代码:

use EMISE

go

begin tran mytran

insert into t_department values('04','电器工程系','欧姆')

insert into t_department values('04','机械工程系','墨子')

if @@ERROR>0

rollback tran mytran

else

commit tran mytran

select *from t_department

  1. 把题目 1 中的数据改为(1)04,电器工程系,伏特;(2)05,机械工程系,墨子;再次运行代码,查看结果和消息。

3.使用存储过程中定义事务实现银行转账业务处理。

use master

go

if DB_ID('bankdb') is not null

drop database bankdb;

go

create database bankdb

go

use bankdb

go

create table account(

id int identity(1,1) primary key,

cardno char(20) unique not null,

balance numeric(18,2)

)

go

insert into account values('01',100.0)

insert into account values('02',200.0)

insert into account values('03',300.0)

go

--创建存储过程

create procedure Sp_transfer_money

@out_cardno char(20),

@in_cardno char(20),

@money numeric(18,2)

as

begin

declare @remain numeric(18,2)

select @remain=balance from account where cardno=@out_cardno

if @money>0

if @remain>=@money --余额足够

begin

begin tran t1

update account set balance=balance-@money where cardno=@out_cardno

update account set balance=balance+@money where cardno=@in_cardno

if @@error>0

begin ---wrong

rollback tran t1

return 0

end

else

begin ---right

commit tran t1

print '转账成功!'

end

end

else ---余额少

begin

print '余额不足'

end

else --- 转账金额小于0

print '转账金额应大于0!'

end

go

exec Sp_transfer_money '01','02',50

4.在SQL Server中查看数据库中的锁。

(1)使用快捷键“Ctrl+2”查看锁的信息。

打开SQL Server2014的SSMS,在查询分析器中使用快捷键“Ctrl+2”,即可看到进程、锁已经对象等信息。

2)使用系统存储过程Sp_lock来查看数据库中的锁

在新建查询的编辑区内,键入“EXEC Sp_lock”,执行这个命令也可以查看当前数据库中的锁。

EXEC Sp_lock

5.使用表级锁。在 SQL Server 中模拟两个用户对表进行操作,其中一个用户查看学生表信息,并锁定 20ms;另一个用户也查看学生表,并要更新其中的数据。

(1)创建一个新的查询窗口,在编辑区窗口内键入如下代码,并保存为user1_lock.SQL。

use EMISE

go

begin tran t1

declare @SD_time varchar(8)

select *from t_student with(holdlock)

select @SD_time=convert(varchar,getdate(),8)

print '用户1锁定时间为:'+@SD_time

waitfor delay '00:00:20'

select @SD_time=convert(varchar,getdate(),8)

print '用户1锁定时间为:'+@SD_time

commit tran t1

(2)创建一个新的查询窗口,在编辑区窗口键入如下代码,并保存为user2_update.SQL。

use EMISE

go

begin tran t2

declare @sd_time varchar(8)

--select *from t_student with(holdlock)

select @sd_time=convert(varchar,getdate(),8)

print '用户2开始时间为:'+@sd_time

select *from t_student

select @sd_time=convert(varchar,getdate(),8)

print '用户2执行查询的时间为:'+@sd_time

update t_student set name='wang' where name='王庆子'

select @sd_time=convert(varchar,getdate(),8)

print '用户2更新数据的时间为:'+@sd_time

commit tran t2

实验结果及分析

经检验,实验基本达到预期效果。通过此次上机实验,使我更加熟悉了对SQL语句及其应用,第四次上机调试已经不感到陌生。在SQL语句调试的过程中虽错误总是千奇百怪,但根据老师教授的知识很快的得以纠正,完成了本次实验,通过本次实验,深刻的意识到自身的不足,也明白了理论与实践的差距,同时自己学过的知识也得以加深理解与巩固,感谢老师给予我们机会,使我们的知识更加牢固!

  • 27
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验五 触发器实验报告 [实验目的] 1. 理解Oracle触发器的种类和用途 2. 掌握行级触发器的编写 [预备知识] 1. PL/SQL程序设计 [实验原理] 1. 建立触发器 CREATE [OR REPLACE] TRIGGER <触发器名> BEFORE"AFTER INSERT"DELETE"UPDATE OF <列名> ON <表名> [FOR EACH ROW] WHEN (<条件>) <PL/SQL 程序块> ON 子句中的名称识别与数据库触发器关联的数据库表 触发器事件指定了影响表的 SQL DML 语句 ( INSERT、 DELETE 或 UPDATE) AFTER 指定了触发器在处理完成后触发 BEFORE 指定了触发器在处理完成前触发 默认情况下,触发器每个表触发一次 FOR EACH ROW 选项指定触发器每行触发一次(即触发器为行级触发器) 要使触发器触发,WHEN 子句中布尔型表达式的值必须判定为 TRUE 可以将 REPLACE 添加到 CREATE 语句以自动删除和重建触发器 2. 行级触发器中引用表数据 在行级触发器中,使用伪记录来表示旧数据:old和新数据:new 引用示例::new.customer_name, :old.customer_name 3. 行级触发器中的谓词 在一个多条件触发的触发器中,使用谓词可以区分当前触发的操作的类型:inserting, updating,deleting。 示例: IF Inserting THEN 语句 ; END IF; IF Updating THEN 语句 ; END IF; IF Deleting THEN 语句 ; END IF; 4. 触发器的限制 SELECT 语句必须是 SELECT INTO 语句或内部游标声明。 行级触发器不可以对触发表进行查询,包括其调用的子过程中。 不允许 DDL 声明和事务控制语句 。 如果由触发器调用存储过程,则存储子程序不能包括事务控制语句 。 :old 和 :new 值的类型不能是 LONG 和 LONG RAW。 [实验内容] 1. 给Customer表增加一列Savings,类型为int,来存放每个顾客的存款总额。 ALTER TABLE customer ADD (saving varchar2(30)); select * from customer; 2. 更新Customer表,使得Savings字段的值正确。 3. 在Account表上增加一个行级触发器,当对account的balance进行update和insert一个 记录时同步修改Customer的Savings字段,保证数据的一致性。 4. 对account进行update操作,记录account表和customer表的变化。 5. 去掉顾客- 存款账号表中引用account表的外键约束(如果不去掉,后面的操作无法实现。当然最 佳的方法是修改其外键约束的更新策略,但考虑到复杂性,这里使用不标准的做法, 但建议大家实际运用中不要这么做)。在顾客- 存款账号表插入一条记录,表明顾客开设了一个新的账户。 6. 将一条刚才新开账户号的存款记录插入账号表,记录account表和customer表的变化。 [实验总结] 1. 实验中遇到的问题和解决的方法。 ----------------------- "触发事件 ":old ":new " "Insert "无定义,所有字段都是N"该语句完成后插入的值 " " "ULL " " "Update "更新前该行的旧值 "更新后该行的值 " "Delete "删除前该行的值 "无定义,所有字段都是N" " " "ULL "

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值