当前位置: 首页 > article >正文

MySQL【存储过程与存储函数】

#第15章_存储过程与存储函数

#0.准备工作

CREATE DATABASE dbtest15;

USE dbtest15;

CREATE TABLE employees
AS
SELECT *
FROM atguigudb.employees;

CREATE TABLE departments
AS
SELECT * FROM atguigudb.departments;

SELECT * FROM employees;

SELECT * FROM departments;

#1. 创建存储过程

#类型1:无参数无返回值

#举例1:创建存储过程select_all_data(),查看 employees 表的所有数据

DELIMITER $

CREATE PROCEDURE select_all_data()
BEGIN
SELECT * FROM employees;
END $

DELIMITER ;

#2. 存储过程的调用

CALL select_all_data();

#举例2:创建存储过程avg_employee_salary(),返回所有员工的平均工资

DELIMITER //

CREATE PROCEDURE avg_employee_salary()
BEGIN
SELECT AVG(salary) FROM employees;

END //

DELIMITER ;

#调用
CALL avg_employee_salary();

#举例3:创建存储过程show_max_salary(),用来查看“emps”表的最高薪资值。

DELIMITER //

CREATE PROCEDURE show_max_salary()
BEGIN
SELECT MAX(salary)
FROM employees;
END //

DELIMITER ;

#调用
CALL show_max_salary();

#类型2:带 OUT
#举例4:创建存储过程show_min_salary(),查看“emps”表的最低薪资值。并将最低薪资
#通过OUT参数“ms”输出

DESC employees;

DELIMITER //

CREATE PROCEDURE show_min_salary(OUT ms DOUBLE)
BEGIN
SELECT MIN(salary) INTO ms
FROM employees;
END //

DELIMITER ;

#调用

CALL show_min_salary(@ms);

#查看变量值
SELECT @ms;

#类型3:带 IN
#举例5:创建存储过程show_someone_salary(),查看“emps”表的某个员工的薪资,
#并用IN参数empname输入员工姓名。

DELIMITER //

CREATE PROCEDURE show_someone_salary(IN empname VARCHAR(20))
BEGIN
SELECT salary FROM employees
WHERE last_name = empname;
END //

DELIMITER ;

#调用方式1
CALL show_someone_salary(‘Abel’);
#调用方式2
SET @empname := ‘Abel’;
CALL show_someone_salary(@empname);

SELECT * FROM employees WHERE last_name = ‘Abel’;

#类型4:带 IN 和 OUT
#举例6:创建存储过程show_someone_salary2(),查看“emps”表的某个员工的薪资,
#并用IN参数empname输入员工姓名,用OUT参数empsalary输出员工薪资。

DELIMITER //

CREATE PROCEDURE show_someone_salary2(IN empname VARCHAR(20),OUT empsalary DECIMAL(10,2))
BEGIN
SELECT salary INTO empsalary
FROM employees
WHERE last_name = empname;
END //

DELIMITER ;

#调用
SET @empname = ‘Abel’;
CALL show_someone_salary2(@empname,@empsalary);

SELECT @empsalary;

#类型5:带 INOUT
#举例7:创建存储过程show_mgr_name(),查询某个员工领导的姓名,并用INOUT参数“empname”输入员工姓名,
#输出领导的姓名。

DESC employees;

DELIMITER $

CREATE PROCEDURE show_mgr_name(INOUT empname VARCHAR(25))
BEGIN

SELECT last_name INTO empname
FROM employees
WHERE employee_id = (
			SELECT manager_id
			FROM employees
			WHERE last_name = empname
			);

END $

DELIMITER ;

#调用
SET @empname := ‘Abel’;
CALL show_mgr_name(@empname);

SELECT @empname;

#2.存储函数

举例1:创建存储函数,名称为email_by_name(),参数定义为空,

#该函数查询Abel的email,并返回,数据类型为字符串型。

DELIMITER //

CREATE FUNCTION email_by_name()
RETURNS VARCHAR(25)
DETERMINISTIC
CONTAINS SQL
READS SQL DATA
BEGIN
RETURN (SELECT email FROM employees WHERE last_name = ‘Abel’);
END //

DELIMITER ;

#调用
SELECT email_by_name();

SELECT email,last_name FROM employees WHERE last_name = ‘Abel’;

#举例2:创建存储函数,名称为email_by_id(),参数传入emp_id,该函数查询emp_id的email,
#并返回,数据类型为字符串型。

#创建函数前执行此语句,保证函数的创建会成功
SET GLOBAL log_bin_trust_function_creators = 1;

#声明函数

DELIMITER //

CREATE FUNCTION email_by_id(emp_id INT)
RETURNS VARCHAR(25)

BEGIN
RETURN (SELECT email FROM employees WHERE employee_id = emp_id);

END //

DELIMITER ;

#调用
SELECT email_by_id(101);

SET @emp_id := 102;
SELECT email_by_id(@emp_id);

#举例3:创建存储函数count_by_id(),参数传入dept_id,该函数查询dept_id部门的
#员工人数,并返回,数据类型为整型。

DELIMITER //

CREATE FUNCTION count_by_id(dept_id INT)
RETURNS INT

BEGIN
RETURN (SELECT COUNT(*) FROM employees WHERE department_id = dept_id);

END //

DELIMITER ;

#调用
SET @dept_id := 50;
SELECT count_by_id(@dept_id);

#3. 存储过程、存储函数的查看

#方式1. 使用SHOW CREATE语句查看存储过程和函数的创建信息

SHOW CREATE PROCEDURE show_mgr_name;

SHOW CREATE FUNCTION count_by_id;

#方式2. 使用SHOW STATUS语句查看存储过程和函数的状态信息

SHOW PROCEDURE STATUS;

SHOW PROCEDURE STATUS LIKE ‘show_max_salary’;

SHOW FUNCTION STATUS LIKE ‘email_by_id’;

#方式3.从information_schema.Routines表中查看存储过程和函数的信息

SELECT * FROM information_schema.Routines
WHERE ROUTINE_NAME=‘email_by_id’ AND ROUTINE_TYPE = ‘FUNCTION’;

SELECT * FROM information_schema.Routines
WHERE ROUTINE_NAME=‘show_min_salary’ AND ROUTINE_TYPE = ‘PROCEDURE’;

#4.存储过程、函数的修改
ALTER PROCEDURE show_max_salary
SQL SECURITY INVOKER
COMMENT ‘查询最高工资’;

#5. 存储过程、函数的删除

DROP FUNCTION IF EXISTS count_by_id;

DROP PROCEDURE IF EXISTS show_min_salary;


http://www.kler.cn/news/18575.html

相关文章:

  • 操作系统基础知识介绍之指令集体系结构:RISC-V寄存器(掺杂与ARM和X86部分比对)
  • 羡慕!因工作琐事太多,女子果断从体制内裸辞
  • 使用FastAPI构建高效Python Web应用程序的详细教学
  • HBase:Hadoop生态系统中的分布式NoSQL数据库【上进小菜猪大数据系列】
  • 安装gitea
  • 【web】HTTP工作原理及应用
  • 基于SpringBoot的线上日志阅读器
  • Midjourney生成LOGO指南
  • 静态代码块、实例代码块、构造方法的执行顺序
  • Linux介绍及环境搭建
  • Liunx 使用命令连接Redis
  • 关于 std::condition_variable
  • web之iframe的那些事、打开外链、窗口、嵌入、iframe、location、href、replace、open、assign
  • KingbaseES V8R6备份恢复系列之 -- system-Id不匹配备份故障
  • Java引用类型(强引用,软引用,弱引用,虚引用)
  • 运维高可用架构的 6 大常规方案
  • 重新定义座舱智能化的下半场?谁能抓住弯道超车的窗口期
  • 《Kubernetes证书篇:基于cfssl工具集一键生成二进制kubernetes集群相关证书(方法一)》
  • MySQL:数学函数和字符串函数
  • VMware NSX Advanced Load Balancer (NSX ALB) 22.1.3 - 负载均衡平台
  • 从零构建自己的脚手架
  • 【多线程初阶三】简单了解wait和notify方法~
  • [Go语言实战]并发模式runner
  • iOS输入限制表情输入、最大字符、正则过滤
  • Geoffrey Hinton对于AI的警示 20230507
  • SQL 招聘网站岗位数据分析
  • 数据挖掘笔记
  • Spring-AOP
  • 文心一言 VS chatgpt (6)-- 算法导论2.3 1~2题
  • macOS的CAOpenGLLayer中如何启用OpenGL3.2 core profile