存储过程

语法grammar

语法结构

创建

delimiter //
create procedure hello()
begindeclare hellow varchar(32) default 'hellow';  -- 定义hellow变量select hellow;set hellow = 'helloworld';   -- 赋值select hellow;
end //

调用

call hello();

调用结果:

删除

drop procedure hello;

变量

局部变量

作用于begin end 里的变量。

用户变量

在每次连接时可定义存在的变量。例如,打开终端打开mysql后输入密码,输入set @nu = nummm,之后在此次连接中,可以随时查询这个变量,select @nu 将会出现前面赋予的nummm。

会话变量

由系统提供,当前会话(连接)有效。

语法:
@@session.var_name
show session variables; -- 查看会话变量
select @@session.unique_checks; -- 查看某会话变量
set @@session.unique_checks = 0; --修改会话变量

全局变量

由系统提供,整个mysql服务器有效。

语法:
@@global.var_name

赋值

set

set @nu = nummm

into

select d.loc into dept_loc from dept d where d.dname= dept_name;

入参出参(in|out|inout)

in

delimiter //
create procedure inout_in(in upname varchar(32))
beginset @up_name = upname;
end //
call inout_in('zhuyidan');
select @up_name;

运行结果:

out

delimiter //
create procedure inout_out(in dept_name varchar(32),out dept_loc varchar(64))
beginselect d.loc into dept_loc from dept d where d.dname= dept_name;
end //
call inout_out('SALES',@dept_name);
select @dept_name;

运行结果:

inout

delimiter //
create procedure inout_inout(in dept_loc varchar(64),inout dept_name varchar(32))
begin-- 出参 加上dept_name带过来的字符串declare d_name VARCHAR(32);set d_name = dept_name;select d.dname into dept_name from dept d where d.loc = dept_loc;-- 用concat函数来拼接select concat(dept_name,'-',d_name);
end //
set @dept_name = 'Hello';
call inout_inout('NEW YORK',@dept_name);
select @dept_name;

运行结果:

流程控制—判断

if

delimiter //
create PROCEDURE time_if(in emp_id int)
BEGINDECLARE sub_time int;DECLARE result VARCHAR(32) character set gbk;  -- 用character 来设置一下格式就可以避免报类似乱码的错误SELECT TIMESTAMPDIFF(YEAR,hiredate,'2020-05-06') into sub_time FROM emp WHERE empno = emp_id;IF sub_time <20 THEN set result = '新手';ELSEIF sub_time <30 THEN set result = '老手';ELSE set result = '老员工';END IF;SELECT result;
END //

运行结果:

case

delimiter //
CREATE PROCEDURE time_case(in emp_id int)
BEGINDECLARE sub_time int;DECLARE result VARCHAR(32) character set gbk;SELECT TIMESTAMPDIFF(YEAR,hiredate,'2020-05-06') into sub_time FROM emp WHERE empno = emp_id;CASE WHEN sub_time < 20 THEN set result = '新手';WHEN sub_time < 30 THEN set result = '老手';ELSE set result = '老员工';END CASE;SELECT result;
end //
CALL time_case(7369);

运行结果:

流程判断—循环

loop

delimiter //
CREATE PROCEDURE test_loop()
BEGINDECLARE n_index int DEFAULT 1; DECLARE result_str VARCHAR(30) DEFAULT 0;test_loo: LOOPset result_str = CONCAT(result_str,',',n_index);IF n_index >10 THEN LEAVE test_loo; END IF;set n_index = n_index + 1;END LOOP test_loo;SELECT result_str;
end //
CALL test_loop();

运行结果:

repeat

delimiter //
CREATE PROCEDURE test_repeat()
BEGINDECLARE n_index int DEFAULT 1;DECLARE result_str VARCHAR(30) DEFAULT '1';count_index:REPEATset n_index = n_index + 1;set result_str = CONCAT(result_str,',',n_index);UNTIL n_index > 10 END REPEAT count_index;SELECT result_str;
END //

运行结果:

while

CREATE PROCEDURE test_while()
BEGINDECLARE n_index int DEFAULT 1;DECLARE result_str VARCHAR(30) DEFAULT '1';WHILE n_index < 10 DOSET n_index = n_index + 1;SET result_str = CONCAT(result_str,',',n_index);END WHILE;SELECT result_str;
END //
CALL test_while();

运行结果:

游标

语法

-- 声明语法
DECLARE cursor_name CURSOR FOR select_statement
-- 打开语法
OPEN cursor_name
-- 取值语法
FETCH cursor_name INTO var_name [, var_name] ...
-- 关闭语法
CLOSE cursor_name

注hander语法

DECLARE handler_action HANDLERFOR condition_value [, condition_value] ...statementhandler_action: {CONTINUE| EXIT| UNDO
}condition_value: {mysql_error_code| SQLSTATE [VALUE] sqlstate_value| condition_name| SQLWARNING| NOT FOUND| SQLEXCEPTION
}CONTINUE: Execution of the current program continues.
EXIT: Execution terminates for the BEGIN ... END compound statement in which the handler is declared. This is true even if the condition occurs in an inner block.SQLWARNING: Shorthand for the class of SQLSTATE values that begin with '01'.
NOT FOUND: Shorthand for the class of SQLSTATE values that begin with '02'.
SQLEXCEPTION: Shorthand for the class of SQLSTATE values that do not begin with '00', '01', or '02'.-- 注各种写法DECLARE exit HANDLER FOR SQLSTATE '42S01' set @res_table = 'EXISTS';DECLARE continue HANDLER FOR 1050 set @res_table = 'EXISTS';DECLARE continue HANDLER FOR not found set @res_table = 'EXISTS';

tips

在语法中,变量声明、游标声明、handler声明是必须按照先后顺序书写的,否则创建存储过程出错。

程序演示

delimiter //
CREATE PROCEDURE test_cursor(in dept_name VARCHAR(32))
BEGINDECLARE e_no int;DECLARE e_name VARCHAR(32);DECLARE e_sal DECIMAL(7,2);-- 定义一个布尔值,用于后面的错误判断DECLARE fl_flag BOOLEAN DEFAULT TRUE;-- 定义游标DECLARE t_cursor cursor forSELECT e.empno,e.ename,e.sal from emp e,dept d WHERE e.deptno = d.deptno and d.dname      = dept_name;-- hander 句柄 注:1329 错误为在不使用hander下程序的循环报错,找不到数据,该查询总共只有两行数据,当fetch抓取了两行后抓第三行便开始报错,后无法走出循环。DECLARE CONTINUE HANDLER for 1329 set fl_flag = false;OPEN t_cursor;cur_loop: LOOPFETCH t_cursor into e_no,e_name,e_sal;-- 用hander使fl——flag值为false,跳出循环IF fl_flag = FALSE THENLEAVE cur_loop; END IF; SELECT e_no,e_name,e_sal;END LOOP cur_loop;-- 检验是否跳出循环set @flag = 'end';CLOSE t_cursor;
END //call test_cursor('RESEARCH');
SELECT @flag;

运行结果:

1

2

存储函数

语法

--创建
CREATE FUNCTION <函数名>([<参数名> <数据类型>]) RETURNS <数据类型>
BEGIN<SQL块>RETURN <返回值>;
END;--调用
SELECT <函数名>([<参数>]);

代码示例

-- 定义一个存储函数,获取满足条件的总记数
delimiter //
CREATE FUNCTION fun1(in dept_no int)
RETURNS int
BEGINDECLARE d_no int;SELECT count(*) INTO d_no FROM emp WHERE deptno = dept_no;return d_no;
end //
select fun1(30);

文末:附建表查询:

-- dept表
CREATE TABLE dept(
deptno int COMMENT '部门编号',
dname VARCHAR(32) COMMENT '部门名称',
loc VARCHAR(64) COMMENT '部门地址';)-- emp表
create table emp(
empno int COMMENT'员工编号',
ename VARCHAR(32) COMMENT '员工姓名',
job VARCHAR(10) COMMENT '职位',
mgr int COMMENT '上级编号',
hiredate date COMMENT '入职时间',
sal DECIMAL(7,2) COMMENT '薪资',
comm DECIMAL(7,2) COMMENT '年终奖金',
deptno INT COMMENT '部门编号');-- dept表数据插入
insert into dept VALUES (10,'ACCOUNTING','NEW YORK');
insert into dept VALUES (20,'RESEARCH','DALLAS');
insert into dept VALUES (30,'SALES','CHICAGO');
insert into dept VALUES (40,'OPERATIONS','BOSTON');-- emp表数据插入
INSERT INTO emp VALUES (7369,'smith','clerk','7902','1980-12-17','800',NULL,20);
INSERT INTO emp VALUES (7499,'allen','salesman','7698','1981-02-20','1600','300',30);
INSERT INTO emp VALUES (7521,'ward','salesman','7698','1981-10-17','1250','500',30);
INSERT INTO emp VALUES (7566,'jones','manager','7839','1981-09-28','2975',NULL,10);-- emp表数据插入
INSERT INTO emp VALUES (7369,'smith','clerk','7902','1980-12-17','800',NULL,20);
INSERT INTO emp VALUES (7499,'allen','salesman','7698','1981-02-20','1600','300',30);
INSERT INTO emp VALUES (7521,'ward','salesman','7698','1981-10-17','1250','500',30);
INSERT INTO emp VALUES (7566,'jones','manager','7839','1981-09-28','2975',NULL,10);

学习过程分享,学习资源来源B站阿婆主黑马程序员济南中心。

MySQL学习分享之存储过程相关推荐

  1. mysql 学习笔记--存储引擎、索引、sq优化

    全面的 mysql学习笔记–通用语法.函数.数据类型.约束.多表查询.事务 全面的 mysql学习笔记–存储引擎.索引.sql优化 全面的mysql学习笔记–视图/存储过程/触发器.锁.InnoDB引 ...

  2. mysql存储过程大于小于_mysql5.0存储过程操作符知识_函数方法[Mysql学习]

    mysql存储过程基本函数 一.字符串类 CHARSET(str) //返回字串字符集 CONCAT (string2  [,... ]) //连接字串 INSTR (string ,substrin ...

  3. MySQL学习——操作存储过程

    MySQL学习--操作存储过程 摘要:本文主要学习了使用DDL语句操作存储过程的方法. 了解存储过程 是什么 存储过程是一组为了完成特定功能的SQL语句集合. 使用存储过程的目的是将常用或复杂的工作预 ...

  4. Mysql 创建表、存储过程、触发器 -Angelo 分享

    Mysql 创建表.存储过程.触发器 -Angelo 分享 简单的小例子,创建两个表,一个存储过程,一个触发器 存储过程是个 while 循环,也很简单,循环网表里插数据 功能:表一只要有insert ...

  5. MySQL学习记录 (五) ----- 存储函数、存储过程和触发器

    相关文章: <MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令> <MySQL学习记录 (二) ----- SQL数据查询语句(DQL)> &l ...

  6. MySQL学习思维导图(MySQL简介、SQL基础命令、约束、单表查询、多表查询、内置函数、存储过程、视图、事务、索引)

    MySQL学习思维导图 内容包括:MySQL简介.SQL基础命令.约束.单表查询.多表查询.内置函数.存储过程.视图.事务.索引 文章目录 MySQL学习思维导图 一.MySQL简介 二.SQL基础命 ...

  7. MySQL学习笔记(2)——存储过程与存储函数

    MySQL学习笔记(2)--存储过程与存储函数 文章目录 MySQL学习笔记(2)--存储过程与存储函数 一.存储过程 1.概念:预先编译好的sql语句的集合,理解成批处理语句 2.好处: 3.语法: ...

  8. 【MySQL学习】使用视图、存储过程、游标和触发器

    视图.储存过程.游标和触发器 视图 利用视图简化复杂的联结 用视图重新格式化检索出的数据 用视图过滤不想要的数据 使用视图与计算字段 更新视图 存储过程 为什么要使用存储过程 使用存储过程 执行存储过 ...

  9. MySQL 学习笔记-第三篇-索引、存储过程和函数、视图、触发器

    目录 1 索引 1.1 索引简介 1.2 创建索引 1.3 删除索引 1.4 MySQL 8.0 的新特性 1 -支持降序索引 1.5 MySQL 8.0 的新特性 2 -统计直方图 2 存储过程和函 ...

最新文章

  1. 揭秘美国空军如何用AI技术提升“战斗力”
  2. Python机器学习(1)-- 自己设计一个感知机(Perceptron)分类算法
  3. 计算机序号函数,EXCEL函数自动编号/编码单条件和多条件的几种方法
  4. 中国高铁站,为什么离市区这么远
  5. 写给你的数据结构教程(第一天)
  6. 【Python3网络爬虫开发实战】1.2.4-GeckoDriver的安装
  7. Hdu 1026 Ignatius and the Princess I
  8. 1036: [ZJOI2008]树的统计Count(树链剖分)
  9. 编辑PDF的软件哪个好 如何修改PDF文件
  10. ajax报502错误,ajax服务器返回502
  11. 3.9 编写程序,模拟石头剪刀布游戏。程序随机产生一个数,这个数为2、1或0,分别表示石头剪刀和布。
  12. 超实用带格子的便签 便签格子的用法
  13. mongodb关机重启
  14. Extjs中加载异步树的最简单例子实现
  15. 6.PCIe协议分析3-PCIe TLP包详解2
  16. 欢迎大家体验滴滴Logi-KafkaManager
  17. 跳板机的工作原理和简单的跳板机实现
  18. 每天一练——斐波那契数列前N项之和
  19. [英语阅读]代金券成热门圣诞礼物
  20. arduino灯光装置_Arduino教程中级 项目一 点亮一盏灯

热门文章

  1. 微信开发之小程序的页面布局
  2. 图像处理的仿射变换与透视变换
  3. 计算机领域有哪些常见的比赛?各个比赛的含金量?
  4. 数据分析基础 - 统计学
  5. 如何写好一份产品需求文档
  6. hbase面试题整理
  7. 微信小程序怎么发布?
  8. php json数据 转义,PHP JSON字符串,转义JS输出的双引号
  9. 黑马程序员----swift基础语法!
  10. 【问链财经-区块链基础知识系列】 第四十四课 邮储银行:U链福费廷业务系统