一、目的与要求

(1)掌握存储过程创建和调用的方法;

(2)掌握MySQL中程序片段的组成;

(3)掌握游标的使用方法;

(4)掌握存储函数创建和调用的方法;

(5)掌握触发器的使用方法;

(6)掌握事件的创建和使用方法;

二、实验内容

(1)了解存储过程体中允许的SQL语句类型和参数的定义方法;

(2)了解存储过程的调用方法;

(3)了解存储函数的定义和调用方法;

(4)了解触发器的作用和调用方法;

(5)了解事件的作用和定义方法;

三、实验结果

1.存储过程

(1)创建存储过程,使用Employees表中的员工人数来初始化一个局部变量,并调用这个存储过程。

USE YGGL

DELIMITER $$

CREATE PROCEDURE TEST(OUT NUMBER1 INTEGER) BEGIN DECLARE NUMBER2 INTEGER;

SET NUMBER2=(SELECT COUNT(*) FROM Employees);

SET NUMBER1=NUMBER2;

END $$ DELIMITER;

CALL TEST(@NUMBER);

select @NUMBER;

(2)创建存储过程,比较两个员工的实际收入,若前者比后者高就输出0,否则输出1.

DELIMITER $$

CREATE PROCEDURE COMPA(IN ID1 CHAR(6),IN ID2 CHAR(6),OUT BJ INTEGER) BEGIN DECLARE SR1,SR2 FLOAT(8);

SELECT InCome-OuTCome INTO SR1 FROM Salary WHERE EmployeesID=ID1;

SELECT InCome-OuTCome INTO SR2 FROM Salary WHERE EmployeesID=ID2;

IF ID1>ID2 THEN

SET BJ=0;

ELSE

SET BJ=1;

END IF;

END$$

DELIMITER;

CALL COMPA('000001','108991',@BJ);

SELECT @BJ;

(3)创建存储过程,使用游标确定一个员工的实际收入是否排在前三名。结果为TRUE表示是,结果为FLASE表示否;

DELIMITER $$

CREATE PROCEDURE TOP_THREE (IN EM_ID CHAR(6),OUT OK BOOLEAN) BEGIN DECLARE X_EM_ID CHAR(6);

DECLARE ACT_IN,SEQ INTEGER;

DECLARE FOUND BOOLEAN;

DECLARE SALARY_DIS CURSOR FOR

SELECT EmployeesID,InCome-OutCome

FROM Salary

ORDER BY 2 DESC;

DECLARE CONTINUE HANDLER FOR NOT FOUND

SET FOUND=FALSE;

SET SEQ=0;

SET FOUND=TRUE;

SET OK=FALSE;

OPEN SALARY_DIS;

FETCH SALARY_DIS INTO X_EM_ID,ACT_IN;

WHILE FOUND AND SWQ<3 AND OK=FALSE DO

SET SEQ=SEQ+1;

IF X_EM_ID=EM_ID THEN

SET OK=TRUE;

END IF;

FETCH SALARY_DIS INTO X_EM_ID,ACT_IN;

END WHILE;

CLOSE SALARY_DIS;

END $$

DELIMITER;

2.存储函数

创建一个存储函数,返回员工的总人数。

CREATE FUNCTION EM_MUM() RETURNS INTEGER RETURN(SELECT COUNT(*) FROM Employees);

select EM_MUM();

(2)创建一个存储函数,删除在Salary表中但在Employees表中不存在的员工号。若在Employees表中存在返回FALSE,若不存在则删除该工号并返回TRUE.

DELIMITER $$

CREATE FUNCTION DELETE_EM(EM_ID CHAR(6))

RETURNS BOOLEAN

BEGIN

DECLARE EM_NAME CHAR(10);

SELECT Name INTO EM_NAME FROM Employees WHERE EmployeesID=EM_ID;

IF EM_NAME IS NULL THEN

DELETE FROM Salary WHERE EmployeesID=EM_ID;

RETURN TRUE;

ELSE

RETURN FALSE;

END IF;

END$$

DELIMITER ;

SELECT DELETE_EM(‘000001’);

3.触发器

(1)创建触发器,在Employees表中删除员工信息的同时将Salary表中该员工的2信息删除,以确保数据完整性;

CREATE TRIGGER DELETE_EM AFTER DELETE ON Employees FOR EACH ROW DELETE FROM Salary WHERE EmployeesID=OLD.EmployeesID;

delete from Employees where EmployeesID="010008";

select * from Employees;

select * from Salary;

(2)假设Deaprtments2表和Departments表的结构和内容都相同,在Departments上创建一个触发器,如果添加一新的部门,该部门也会添加到Departments2表中;

创建一个与Departments表结构相同的Departments2表;

create table Departments2 like Departments;

DELIMITER $$

CREATE TRIGGER Departments_Ins AFTER INSERT ON Departments FOR EACH ROW BEGIN INSERT INTO Departments2 VALUES(NEW. DepartmentID,NEW. DepartmentName,NEW.Note);

END$$ DELIMITER ;

insert into Departments values(‘6’,’网络部’,”);

select * from Departments2;

(3)当修改表Employee2时,若将Employees表中员工的工作时间增加一年,则将收入增加500,增加2年则增加1000,。依次增加。若工作时间减少则无变化;

DELIMITER $$

CREATE TRIGGER ADD_SALARY

AFTER UPDATE ON Employees FOR EACH ROW

BEGIN

DECLARE YEARS INTEGER;

SET YEARS=NEW.WorkYear-OLD.WorkYear;

IF YEARS>0 THEN

UPDATE Salary SET InCome=InCome+500*YEARS

WHERE Employees=NEW.EmployeesID;

END IF;

END$$

DELIMITER ;

SELECT * from Salary;

update Employees

set WorkYear=WorkYear+2;

replace into Employees values('000001','王林','大专','1966-01-23','1',10,'中山路32-1-508','83355668','2');

select * from Employees;

SELECT * from Salary;

4.事件

创建一个立即执行的事件,查询Employees表的信息;

CREATE EVENT direct_happen ON SCHEDULE AT NOW() DO SELECT * FROM Employees;

(2)创建一个时间,每天执行一次,它从2015年12月31日结束;

DELIMITER $$

CREATE EVENT every_day on SCHEDULE EVERY 1 DAY STARTS CURDATE()+INTERVAL 1 DAY ENDS '2015-12-31' DO BEGIN SELECT * FROM Employees;

END$$ DELIMITER ;

四、实验总结

本次实验主要的内容为创建、调用、删除、修改过程体、存储函数、触发器、事件。感觉做起来难度有点大,主要还是因为不熟悉这些基本原理。期间有些问题解决了,还有一些仍待解决;本次试验中感觉到了数据库中的过程式存储对象对于数据库实现复杂·的功能是必不可少的一环,过程式数据库对象确实功能非常强大。

五、代码

#####实验六################

select 194*142;

select 'I\nlove\nMySQL';

select @@VERSION;

select CURRENT_TIME;

use YGGL

set @female=0;

select EmployeesID,Name

from Employees

where sex=@female;

set @phone=(select PhoneNumber

from Employees

where EmployeesID='111006');

select @phone;

select InCome-OutCome

from Salary;

select *

from Employees

where WorkYear > 5;

select (7>6) AND ('A'='B');

select GREATEST(5,76,25.9),LEAST(5,76,25.9);

SELECT ROUND(5.33);

SELECT ABS(-5);

SELECT SQRT(9);

SELECT COUNT(EmployeesID) as 广告部人数

from Employees

where DepartmentID=

(SELECT DepartmentID

from Departments

where DepartmentName='广告部');

select CONCAT('Ilove','MySQL');

select ASCII('ABC');

select NOW();

SELECT YEAR(Birthday)

from Employees

where EmployeesID='000001';

############### 实验七####################

USE YGGL

DELIMITER $$

CREATE PROCEDURE TEST(OUT NUMBER1 INTEGER)

BEGIN

DECLARE NUMBER2 INTEGER;

SET NUMBER2=(SELECT COUNT(*) FROM Employees);

SET NUMBER1=NUMBER2;

END $$

DELIMITER;

CALL TEST(@NUMBER);

select @NUMBER;

DELIMITER $$

CREATE PROCEDURE

COMPA(IN ID1 CHAR(6),IN ID2 CHAR(6),OUT BJ INTEGER)

BEGIN

DECLARE SR1,SR2 FLOAT(8);

SELECT InCome-OuTCome INTO SR1 FROM Salary WHERE EmployeesID=ID1;

SELECT InCome-OuTCome INTO SR2 FROM Salary WHERE EmployeesID=ID2;

IF ID1>ID2 THEN

SET BJ=0;

ELSE

SET BJ=1;

END IF;

END$$

DELIMITER;

CALL COMPA('000001','108991',@BJ);

SELECT @BJ;

CREATE FUNCTION EM_MUM()

RETURNS INTEGER

RETURN(SELECT COUNT(*) FROM Employees);

select EM_MUM();

DELIMITER $$

CREATE FUNCTION DELETE_EM(EM_ID CHAR(6))

RETURNS BOOLEAN

BEGIN

DECLARE EM_NAME CHAR(10);

SELECT Name INTO EM_NAME FROM Employees WHERE EmployeesID=EM_ID;

IF EM_NAME IS NULL THEN

DELETE FROM Salary WHERE EmployeesID=EM_ID;

RETURN TRUE;

ELSE

RETURN FALSE;

END IF;

END$$

DELIMITER ;

SELECT DELETE_EM('000001');

DELIMITER $$

CREATE PROCEDURE

TOP_THREE (IN EM_ID CHAR(6),OUT OK BOOLEAN)

BEGIN

DECLARE X_EM_ID CHAR(6);

DECLARE ACT_IN,SEQ INTEGER;

DECLARE FOUND BOOLEAN;

DECLARE SALARY_DIS CURSOR FOR

SELECT EmployeesID,InCome-OutCome

FROM Salary

ORDER BY 2 DESC;

DECLARE CONTINUE HANDLER FOR NOT FOUND

SET FOUND=FALSE;

SET SEQ=0;

SET FOUND=TRUE;

SET OK=FALSE;

OPEN SALARY_DIS;

FETCH SALARY_DIS INTO X_EM_ID,ACT_IN;

WHILE FOUND AND SWQ<3 AND OK=FALSE DO

SET SEQ=SEQ+1;

IF X_EM_ID=EM_ID THEN

SET OK=TRUE;

END IF;

FETCH SALARY_DIS INTO X_EM_ID,ACT_IN;

END WHILE;

CLOSE SALARY_DIS;

END $$

DELIMITER;

CREATE TRIGGER DELETE_EM AFTER DELETE

ON Employees FOR EACH ROW

DELETE FROM Salary

WHERE EmployeesID=OLD.EmployeesID;

delete from Employees where EmployeesID="010008";

select * from Employees;

select * from Salary;

create table Departments2 like Departments;

DELIMITER $$

CREATE TRIGGER Departments_Ins

AFTER INSERT ON Departments FOR EACH ROW

BEGIN

INSERT INTO Departments2 VALUES(NEW. DepartmentID,NEW. DepartmentName,NEW.Note);

END$$

DELIMITER ;

insert into Departments values('6','网络部','');

select * from Departments;

select * from Departments2;

DELIMITER $$

CREATE TRIGGER ADD_SALARY

AFTER UPDATE ON Employees FOR EACH ROW

BEGIN

DECLARE YEARS INTEGER;

SET YEARS=NEW.WorkYear-OLD.WorkYear;

IF YEARS>0 THEN

UPDATE Salary SET InCome=InCome+500*YEARS

WHERE Employees=NEW.EmployeesID;

END IF;

END$$

DELIMITER ;

SELECT * from Salary;

update Employees

set WorkYear=WorkYear+2;

replace into Employees values('000001','王林','大专','1966-01-23','1',10,'中山路32-1-508','83355668','2');

select * from Employees;

SELECT * from Salary;

CREATE EVENT direct_happen

ON SCHEDULE AT NOW()

DO

SELECT * FROM Employees;

DELIMITER $$

CREATE EVENT every_day

on SCHEDULE EVERY 1 DAY

STARTS CURDATE()+INTERVAL 1 DAY

ENDS '2015-12-31'

DO

BEGIN

SELECT * FROM Employees;

END$$

DELIMITER ;

mysql实验3_MySQL实验(三) 过程式数据库对象的使用相关推荐

  1. mysql实验九_实验十--- MySQL过程式数据库对象

    实验十MySQL过程式数据库对象 一.实验内容: 1. 存储过程的创建和调用 2. 存储函数的创建和调用 3. 触发器的创建和触发 4. 事件的创建和修改 一.实验项目:员工管理数据库 用于企业管理的 ...

  2. 2021-08-18MySQL 第六章过程式数据库对象.23存储函数,触发器

    6.2 存储函数 6.2.1 创建存储函数     create function语法如下: create function 存储过程名([参数...]) returns type [特征...] 存 ...

  3. MySQL优化(三):优化数据库对象

    二.优化数据库对象 1.优化表的数据类型 应用设计的时候需要考虑字段的长度留有一定的冗余,但不推荐很多字段都留有大量的冗余,这样既浪费磁盘空间,也在应用操作时浪费物理内存. 在MySQL中,可以使用函 ...

  4. MYSQL 数据库对象管理实验

    MySQL数据库对象管理 [实验2-1]查看INFORMATION_SCHEMA.SCHEMATA表中的信息. [实验2-2]查看INFORMATION_SCHEMA.TABLES表中的信息. [实验 ...

  5. mysql上机实验报告_数据库上机实验7实验报告.doc

    <数据库上机实验7实验报告.doc>由会员分享,提供在线免费全文阅读可下载,此文档格式为doc,更多相关<数据库上机实验7实验报告.doc>文档请在天天文库搜索. 1. 上机 ...

  6. mysql的触发器实验报告_数据库原理实验报告s11-数据库触发器的创建.doc

    数据库原理实验报告s11-数据库触发器的创建.doc 数据库管理系统SQLSERVER实验报告第1页2011年5月4日实验11数据库触发器的建立实验日期和时间20141128实验室软件工程室班级12计 ...

  7. mysql基本语句实验二 修改表的结构-- 1、修改数据库-- 修改实验一中创建的学生管理数据库studentmanager的字符集为gbk。

    -- 1.修改数据库 -- 修改实验一中创建的学生管理数据库studentmanager的字符集为gbk. alter database studentmanager DEFAULT CHARACTE ...

  8. mysql+安全性语言实验,实验四--数据库的安全性、完整性控制

    --一.创建新的数据库,并且没有任何的约束 --创建三个表 没有任何的约束 create table Student(Sno varchar(20) , Sname varchar(10), Ssex ...

  9. 【数据库实验】实验四 基于嵌入SQL的综合应用编程(基于QSqlTableModel实现)

    [数据库实验]实验四 基于嵌入SQL的综合应用编程 一.实验目的 二.实验要求 三.实验内容.实验结果与主要程序代码 数据准备(建表并插入数据) 前言:黎哥的写法 参考 建表 SQL语言插入数据 S表 ...

最新文章

  1. msbuild FileSysExcludeFiles
  2. PHP如何防止XSS攻击
  3. CCF NOI1010 邮寄包裹
  4. redis修改端口号后还是占用6379_Redis分布式缓存分布式集群搭建
  5. apache开源项目 -- tajo
  6. 平台抗住日访问量 7 亿次,研发品控流程全公开
  7. mysql多数据源事务_springboot项目多数据源及其事务
  8. 使用Varnish为web网站加速
  9. 【网站源码】3D元素周期表源码
  10. 夜神模拟器与mac os之间共享文件
  11. C语言游戏设计——扫雷
  12. 2023面试题大全updating
  13. 永远的七日之都服务器维护,永远的7日之都5月23日更新内容 七日之都5.23更新公告...
  14. 服务器未能识别网络,服务器无法识别url中特殊字符的处理方式
  15. 通过 Dockerfile 搭建标注工具 brat 的镜像
  16. 云原生媒体基础设施为华为云桌面护航
  17. css 如何实现文本竖排、横排展示
  18. 哪些场景N1 mode是disable状态
  19. ISLR统计学习导论之R语言应用(五):R语言实现交叉验证和bootstrap
  20. 卷积神经网络系列之softmax,softmax loss和cross entropy的讲解

热门文章

  1. Python GUI之PyQT QTCreater专讲
  2. 数码相框(十七、数码相框程序编写_先写框架)
  3. 5G智慧港口三维可视化系统 数字孪生赋能升级
  4. 中国今年包揽前三,KDD Cup 20年全回顾
  5. 中职计算机英语教学计划,职高的英语教学计划
  6. vscode python导入模块
  7. 【笔记】Java中抽象类的概述、抽象类的特点、案例(抽象类_员工类代码实现)
  8. 编写良好的代码:如何减少代码的认知负荷
  9. 自然语言处理(1)深度学习基础及其通用模板
  10. 【L1正则化与L2正则化详解及为什么L1和L2正则化可防止过拟合】