MySQL8.0学习笔记(8)—— stored procedures,function
文章目录
- stored procedures
- 创建stored procedures
- 使用MySqlWorkbeach创建stored procedures
- Parameters
- Default Parameters
- Parameters Validation
- Out Parameters
- variables
- function
- 使用函数
stored procedures
创建stored procedures
存储过程(Stored Procedure)是:大型数据库系统中,一组为了完成特定功能的 SQL 语句集,这些SQL语句集存储在数据库中,经过第一次编译后,后续调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
存储过程是数据库的一个重要对象。
- 创建一个存储过程
use sql_invoicing;
//DELIMITER将标准分隔符分号";"更改为$$,保证存储过程内容的整体性
DELIMITER $$
//创建一个新的存储过程,存储过程的名字为get_clients()
CREATE PROCEDURE get_clients()
//BEGIN和END之间的部分称为存储过程的主体
BEGINSELECT * FROM clients;
END$$
DELIMITER ;
- 调用一个存储过程
call sql_invoicing.get_clients();
使用MySqlWorkbeach创建stored procedures
自己写时,每次都要修改限定符有点麻烦,可以按照如下步骤
- 每个database中有 Stored Procedures,右击选择CREATE Stored Procedures
- 只需要关注自己需要填写的内容
- 点击Apply按钮
顺便说下删除stored procedures
DROP PROCEDURE IF EXISTS get_invoices;
- 在点击右下角Apply
Parameters
对于stored procedures构成的参数可以进行传参
USE `sql_invoicing`;
DROP procedure IF EXISTS `git_clients`;DELIMITER $$
USE `sql_invoicing`$$
//state 参数名;char(2)参数类型
CREATE PROCEDURE `git_clients` (state char(2))
BEGIN
select * from client c
where c.state = state;
END$$DELIMITER ;
- 调用
Default Parameters
- 可以指定参数的默认值来执行语句,假如state为NULL,返回全部,否则返回条件满足的数据
USE `sql_invoicing`;
DROP procedure IF EXISTS `git_clients`;DELIMITER $$
USE `sql_invoicing`$$
CREATE PROCEDURE `git_clients` (state char(2))
BEGINIF state IS NULL THENselect * FROM clients;ELSEselect * from client cwhere c.state = state;END IF;
END$$DELIMITER ;//第二种写法
BEGINselect * from client cwhere c.state = IFNULL(state,c.state);
END$$
Parameters Validation
对于参数有时候回去限制其的范围
- 能够对invoices表中的payment_amount 与payment_date进行修改且payment_amount 不为负数
USE `sql_invoicing`;
DROP procedure IF EXISTS `make_payment`;DELIMITER $$
USE `sql_invoicing`$$
CREATE PROCEDURE `make_payment` (invoice_id INT,
//DECIMAL(9,2)表示最大占9位的小数,2位小数点后面保留2位
payment_amount DECIMAL(9,2),payment_date DATE)
BEGINif payment_amount <= 0 THEN//22003错误码表示超过参数范围signal sqlstate '22003' //输出错误的打印信息set message_text = 'Invalid payment amount';end if;update invoices iset i.payment_total = payment_amount,i.payment_date = payment_datewhere i.invoice_id = invoice_id;
END$$DELIMITER ;
Out Parameters
对于传入参数,可以使用传出参数来获取结果需要关键词OUT
- 没有付的订单的客户
USE `sql_invoicing`;
DROP procedure IF EXISTS `get_unpaid_invoices_for_client`;DELIMITER $$
USE `sql_invoicing`$$
CREATE PROCEDURE `get_unpaid_invoices_for_client` (client_id INT,OUT invoices_count int, //输出关键词outOUT invoices_total DECIMAL(9,2)
)
BEGINselect count(*), sum(invoice_total)into invoices_count,invoices_total //将上面两个值传入输出值from invoices iwhere i.client_id = client_idand payment_total = 0;
END$$DELIMITER ;
执行结果
variables
- 全局变量,声明周期在整个连接的过程
set @invoices_count = 0;
- 局部变量,生命周期只在于函数周期内
USE `sql_invoicing`;
DROP procedure IF EXISTS `get_rist_factor`;DELIMITER $$
USE `sql_invoicing`$$
CREATE PROCEDURE `get_rist_factor` ()
BEGIN//声明local变量declare risk_factor decimal(9,2) default 0;declare invoices_total decimal(9,2);declare invoices_cout int;select count(*),sum(invoice_total)into invoices_cout,invoices_totalfrom invoices;set risk_factor = invoices_total / invoices_cout * 5;select risk_factor;
END$$DELIMITER ;
执行
function
function与stored procedures类似,最大的不同是function只能返回单个值,不像stored procedures返回复数值或者行,列。
USE `sql_invoicing`;
DROP function IF EXISTS `get_risk_factor_for_client`;DELIMITER $$
USE `sql_invoicing`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `get_risk_factor_for_client`(client_id int) RETURNS int
-- 每个函数至少有一个attribute-- deterministic 对于每次的输入值都有固定的值相对应,READS SQL DATA -- 表示是一个select语句用于查询-- modifies sql data 表示是一个修改函数例如inert into,update等
BEGINdeclare risk_factor decimal(9,2) default 0;declare invoices_total decimal(9,2);declare invoices_cout int;select count(*),sum(invoice_total)into invoices_cout,invoices_totalfrom invoices iwhere i.client_id = client_id;set risk_factor = invoices_total / invoices_cout * 5;RETURN IFNULL(risk_factor,0);
END$$DELIMITER ;
使用函数
select client_id,name,get_risk_factor_for_client(client_id) as risk_factor
from clients
MySQL8.0学习笔记(8)—— stored procedures,function相关推荐
- 【MySQL8.0学习笔记】约束:主键约束、自增长约束、非空约束、唯一性约束、默认约束与零填充约束
本文对MySQL数据库的约束相关知识进行了归纳总结,包括主键约束.自增长约束.非空约束.唯一性约束.默认约束与零填充约束. 本专栏长期更新,敬请关注. 文章目录 1 MySQL约束简介 2 主键约束 ...
- Mysql8.0学习笔记
一.数据库的常用概念 1.1为什么使用数据库? 1.实现数据的持久化,将数据保存到可掉电式的设备中使用. 即将数据存在硬盘等硬件中,但存储到硬件资源中,数据需要介质,如xsl,doc,jpg等格式,像 ...
- Zabbx6.0(学习笔记)
Zabbx6.0(学习笔记) 目录导航 Zabbx6.0(学习笔记) 一.为什么 需要监控系统 二.如何选择监控 三.Zabbix概述 四.Zabbix安装哪个版本? Zabbix安装要求 1.硬件 ...
- Tensorflow2.0学习笔记(一)北大曹健老师教学视频1-4讲
Tensorflow2.0学习笔记(一)北大曹健老师教学视频1-4讲 返回目录 这个笔记现在是主要根据北京大学曹健老师的视频写的,这个视频超级棒,非常推荐. 第一讲 常用函数的使用(包含了很多琐碎的函 ...
- CCC3.0学习笔记_证书数据
CCC3.0学习笔记_证书数据 系列文章目录 文章目录 系列文章目录 前言 1. [A] - SE Root CA Certificate 2. [B] - SE Root Certificate 3 ...
- flink1.12.0学习笔记第1篇-部署与入门
flink1.12.0学习笔记第 1 篇-部署与入门 flink1.12.0学习笔记第1篇-部署与入门 flink1.12.0学习笔记第2篇-流批一体API flink1.12.0学习笔记第3篇-高级 ...
- mysql5.0镜像_Mysql5.0学习笔记(一)
Mysql5.0学习笔记(一) -基本sql语句与支持字符集 1.登录 mysql -h localhost -u root 2.创建用户firstdb(密码firstdb)和数据库,并赋予权限于fi ...
- Python学习笔记:函数(Function)
Python学习笔记:函数(Function) 一.函数基本概念 函数是Python里组织与重用代码最重要的方法.一般来说,如果你期望多次重复相同或相似的代码,写一个可重用的函数可能是值得的.函数通过 ...
- flink1.12.0学习笔记第2篇-流批一体API
flink1.12.0学习笔记第 2 篇-流批一体API flink1.12.0学习笔记第1篇-部署与入门 flink1.12.0学习笔记第2篇-流批一体API flink1.12.0学习笔记第3篇- ...
- CCC3.0学习笔记_认证和隐私保护
CCC3.0学习笔记_Authentication and Privacy Keys 系列文章目录 文章目录 系列文章目录 前言 1. 手机端和车厂服务器端的密钥存储 2. 密钥的产生和使用的说明 3 ...
最新文章
- python画横条形图-用matplotlib画条形图(bar)
- Lua直接调用动态链接库(DLL或so文件)
- 单片机检测stc没反应_stc单片机无法烧录,一直正在检测目标单片机怎么办?
- 客座招生 | 中科院深圳先进院招收智能机器人方向联培和客座学生
- 运行脚本时用SPOOL保存运行结果的问题
- Vue如何在data中正确引入图片路径
- [渝粤教育] 广东-国家-开放大学 10763k2_客户服务管理_21秋考试
- Anaconda简介:它是什么,以及如何安装
- 什么是阿姆达尔定律?
- C语言的变参函数设计
- 计算机文化书签,《计算机文化基础》EXCEL-机试[1]
- 英语演讲和英语课件ppt模板
- Vue 使用Excel表格导入导出
- 413 Arithmetic Slices
- Excel 下拉多选的设置
- 2016年第七届蓝桥杯决赛心得
- 支付宝花呗额度一直不涨?阿里老员工说出原因,亲测有效
- 1.Linux中超频及cpufreq相关汇总
- 鸿蒙系统安装第三方,网友表示:鸿蒙最新系统可以通过连接U盘安装第三方软件了...
- win10c语言弹出框,win10系统启动程序时弹出异常代码c0000005的解决技巧