当前位置:网站首页>MySQL开发技巧——存储过程
MySQL开发技巧——存储过程
2022-08-01 19:08:00 【椅糖】
目录
一、任务描述
本关任务:为customers表创建一个存储过程,使该存储过程能通过用户的信用额度来区分用户的等级。
二、相关知识
为了完成本关任务,你需要掌握:
1.存储过程的定义;
2.存储过程的创建和查询;
3.存储过程的查询和删除。
存储过程的定义
存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。
存储过程是为了完成特定功能的 SQL 语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。
存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
简单的说存储过程就是具有名字的一段代码,用来完成一个特定的功能。
存储过程的创建和查询
创建存储过程:create procedure 存储过程名(参数)
- 下面我们来创建第一个存储过程
每个存储的程序都包含一个由 SQL 语句组成的主体。此语句可能是由以分号(;)字符分隔的多个语句组成的复合语句。例如:
CREATE PROCEDURE proc1()BEGINSELECT * FROM user;END;
在命令行客户端中,如果有一行命令以分号结束,那么回车后,MySQL 将会执行该命令,但在创建存储过程中我们并不希望 MySQL 这么做。
MySQL 本身将分号识别为语句分隔符,因此必须临时重新定义分隔符以使 MySQL 将整个存储的程序定义传递给服务器。
要重新定义 MySQL 分隔符,请使用该 delimiter命令。使用 delimiter 首先将结束符定义为//,完成创建存储过程后,使用//表示结束,然后将分隔符重新设置为分号(;):
DELIMITER //CREATE PROCEDURE proc1()BEGINSELECT * FROM user;END //DELIMITER ;
注意:/也可以换成其他符号,例如$;
- 执行存储过程:
call 存储过程名

创建带有参数的存储过程
存储过程的参数有三种:IN:输入参数,也是默认模式,表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回;OUT:输出参数,该值可在存储过程内部被改变,并可返回;INOUT:输入输出参数,调用时指定,并且可被改变和返回。
IN参数示例:

OUT参数示例:

INOUT参数示例:

存储过程的查询和删除
我们如何在数据库中查询我们已经创建过的存储过程呢:
SHOW PROCEDURE STATUS WHERE db='数据库名';
查看存储过程的详细定义信息:
SHOW CREATE PROCEDURE 数据库.存储过程名;

当我们不再需要某个存储过程时,我们可以使用:
DROP PROCEDURE [IF EXISTS] 数据库名.存储过程名;

三、编程要求
根据提示,补充代码,创建存储过程GetCustomerLevel(in p_customNumber int(11),out p_customerLevel varchar(10)),通过查询customers表中客户的信用额度,来决定客户级别,并将客户编号和对应等级输出,具体输出内容参考测试集。
customers表数据结构:
| customerNumber | creditlimit |
|---|---|
| 101 | 2000 |
| 102 | 12000 |
| 103 | 6000 |
等级设定:
PLATINUM (creditlim>10000)GOLD (5000<=creditlim<=10000)SILVER(creditlim<5000)
提示:你可能需要使用到定义变量和判断,
变量的定义和使用:
declare 变量名 类型; #定义变量select id into 变量名 from table; #将table表中的id列值赋给变量。
SQL中的if和case语法:IF expression THENstatements;ELSEIF elseif-expression THENelseif-statements;...ELSEelse-statements;END IF;
CASE case-expressionWHEN when_expression_1 THEN commandsWHEN when_expression_2 THEN commands...ELSE commandsEND CASE;
四、代码
USE mydb;
#请在此处添加实现代码
########## Begin ##########
drop procedure if exists mydb.GetCustomerLevel;
delimiter $$
create PROCEDURE GetCustomerLevel(in p_customNumber int(11),out p_customerLevel varchar(10))
Begin
declare levels int;
select creditlimit into levels from customers where customerNumber=p_customNumber;
if levels <5000 then
set p_customerLevel = 'SILVER';
elseif levels <10000 then
set p_customerLevel = 'GOLD';
else
set p_customerLevel = 'PLATINUM';
end if;
select p_customNumber as customerNumber,p_customerLevel;
End $$
delimiter ;
########## End ##########边栏推荐
- Use of message template placeholders
- When compiling a program with boost library with VS2013, it prompts fatal error C1001: An internal error occurred in the compiler
- Win11如何开启剪贴板自动复制?Win11开启剪贴板自动复制的方法
- 如何记录分析你的炼丹流程—可视化神器Wandb使用笔记【1】
- vtk体绘制代码报错的解决办法(代码在vtk7,8,9中都能运行),以及VTK数据集网站
- What are the application advantages of SaaS management system?How to efficiently improve the digital and intelligent development level of food manufacturing industry?
- Source code analysis of GZIPOutputStream class
- Zabbix6.0 DingTalk robot alarm
- 驱动上下游高效协同,跨境B2B电商平台如何释放LED产业供应链核心价值?
- 经验共享|在线文档协作:企业文档处理的最佳选择
猜你喜欢

From ordinary advanced to excellent test/development programmer, all the way through

PHP 安全最佳实践

Win11校园网无法连接怎么办?Win11连接不到校园网的解决方法

【蓝桥杯选拔赛真题47】Scratch潜艇游戏 少儿编程scratch蓝桥杯选拔赛真题讲解

面试必问的HashCode技术内幕

Win11怎么安装语音包?Win11语音包安装教程

Library website construction source code sharing

日志工厂(详细)

从普通进阶成优秀的测试/开发程序员,一路过关斩将

Three solutions: npm WARN config global --global, --local are deprecated. Use --location=global instead.
随机推荐
2022年 PHP面试问题记录
硬件大熊原创合集(2022/07更新)
#yyds dry goods inventory# Interview must brush TOP101: the last k nodes in the linked list
123123123123
使用常见问题解答软件的好处有哪些?
用VS2013编译带boost库程序时提示 fatal error C1001: 编译器中发生内部错误
cf:D. Magical Array【数学直觉 + 前缀和的和】
不要再使用MySQL online DDL了
odoo+物联网
重保特辑|筑牢第一道防线,云防火墙攻防演练最佳实践
在全志V853开发板试编译QT测试
Prometheus的Recording rules实践
MySQL中超键、主键及候选键的区别是什么
Database Plus 的云上之旅:SphereEx 正式开源 ShardingSphere on Cloud 解决方案
How to query database configuration parameters in GBase 8c, such as datestyle.What function or syntax to use?
Mobile Zero of Likou Brush Questions
Friends who want to use the database anytime, anywhere and as you like, all attention!
【pyqt5】自定义控件 实现能够保持长宽比地缩放子控件
有点奇怪!访问目的网址,主机能容器却不行
ExcelPatternTool: Excel form-database mutual import tool