MySQL基础知识:存储过程 – Stored Procedure

MySQL基础知识:存储过程 – Stored ProcedureMySQL存储过程(StoredProcedure)主要的知识点:分隔符(delimiter)变量(variable)参数(parameters)分隔符(DELIMITER)MySQL通过

大家好,又见面了,我是你们的朋友全栈君。

MySQL存储过程(Stored Procedure)主要的知识点:

  • 分隔符(delimiter)
  • 变量(variable)
  • 参数(parameters)

分隔符(DELIMITER)

MySQL通过delimiter来区分不同的SQL语句(SQL Statement),默认的分隔符是 ;

对于procedure,会有多条SQL Statement,且MySQL的每个statement都需要以分隔符结束;

如果我们想把一个procedure作为一条statement,那么我们就不能用默认的分隔符;,否则MySQL Server就不会把procedure里面的多条Statement认作一条statement。

因此,需要临时换一下分隔符delimiter,以使得 procedure 作为一条statement。

变量(Variable)

有三种变量:

  • Stored Procedure的局部变量:作用域在代码块内(begin和end之间),用declare定义。
  • Session级别的session变量 (session variable) 即是 用户自定义变量(User-Defined Variables):作用域在当前连接的session;变量名以@开始。
  • 系统变量 (Server System Variables):全局或会话级。

注意: 一般情况我们在存储过程中都应该使用局部变量

参数

三种参数:

  • IN
  • OUT
  • INOUT

示例:

数据库的dump脚本Github

use mysql_practice;

drop procedure if exists sp_get_customer_basic_info;

-- #1: 吧默认的分隔符从 ';' 改为 '$$'; 
-- 注: $$ 后面没有 ';' 
DELIMITER $$

create procedure sp_get_customer_basic_info
(
	IN limitCount INT,
    OUT totalCount INT
)
BEGIN

declare total_count int default 0; -- 定义局部变量:scope 在BEGIN和END之间

set @session_count = 0; -- 定义session级别的变量。

SELECT 
	cus.no,
	cus.first_name,
	cus.last_name,
	pr.ext_name as province_name,
	cr.ext_name as city_name,
	ar.ext_name as area_name,
	ca.address_detail
FROM mysql_practice.customer cus
join customer_address ca
on ca.customer_id = cus.id
join region ar -- area
on ca.area_id = ar.id and ar.deep = 2
join region cr -- city
on ar.pid = cr.id
join region pr -- province
on cr.pid = pr.id
LIMIT limitCount; -- proceduer里面的sql语句还是用';'分割。

select count(1) into totalCount from mysql_practice.customer; -- 赋值OUT参数

END $$ -- $$表示整个proceduer作为一个statement的结束


DELIMITER ;  -- 改回默认的分隔符: ';'.

执行procedure:

set @totalCount = 0;
call sp_get_customer_basic_info(10, @totalCount );
select @totalCount;

参考资料

  1. SHOW VARIABLES Statement
  2. How to Declare Variables in MySQL
  3. CREATE PROCEDURE and CREATE FUNCTION Statements

MySQL基础知识:存储过程 – Stored Procedure

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/155078.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 缓冲区溢出攻击实验「建议收藏」

    缓冲区溢出攻击实验「建议收藏」又一个计系系统的实验。

  • Python-爬取HTML网页数据

    Python-爬取HTML网页数据Python-爬取HTML网页数据软件环境Mac10.13.1(17B1003)Python2.7.10VSCode1.18.1摘要本文是练手Demo,主要是使用BeautifulSoup来爬取网页数据。BeautifulSoup介绍BeautifulSoup提供一些简单的、python式的用来处理导航、搜索、修改分析树等功能。BeautifulSoup官方

  • 搭建SpringCloud项目,并实现自动化部署[通俗易懂]

    搭建SpringCloud项目,并实现自动化部署[通俗易懂]前一阵子一直在忙着做项目,最近有空,把项目中用到的SpringBoot微服务相关架构再梳理一遍。项目资源:https://github.com/sunroyi/SpringCloud主要分为以下几步:(1)搭建SpringBootService,这里是各个微服务的业务逻辑。(这里搭建了2个Service,用来测试熔断)(2)搭建SpringBootEureka,用来发现服务。(…

  • 查找(二)简单清晰的B树、Trie树具体解释

    查找(二)简单清晰的B树、Trie树具体解释

    2021年11月13日
  • 怎样使用父组件向子组件传值【 必看】

    怎样使用父组件向子组件传值【 必看】呃呃,首先小仙女初学Vue传值的时候,是费尽了脑汁,不知道怎么回事。终于,功夫不负有心人,把他弄明白了,如有错误,请多指教!!首先在学习Vue的框架开发的项目过程中,会经常会用到组件来管理不同的功能,有些公共的东西会就会被抽取出来,当做组件去使用。这时必然会产生一些疑问和需求?比如一个组件调用另一个组件作为自己的子组件,那么我们如何进行给子组件进行传值呢?就先和小编一起探究一下吧!父向子传递…

  • 心形函数的几种表达式怎么求_心形曲线函数4种表达式

    心形函数的几种表达式怎么求_心形曲线函数4种表达式用两个函数表示:f(x)=sqrt(1-(abs(x)-1)^2)h(x)=-2*sqrt(1-0.5*abs(x))也可以根据图中的q(x)画出心形的内部:q(x)=(f(x)-h(x))/2*cos(200*x)+(f(x)+h(x))/2用一个函数表示,我拟合了很久才画出来的:f(x)=(0.64*sqrt(abs(x))-0.8+1.2^abs(x)*cos(200*x))*sqrt(cos(x))定义域:-pi/2<=x<=pi/2我个人觉得要比

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号