mysql 09章_存储过程和函数
一、 函数和存储过程的相同点:
函数和存储过程都是事先预编译并保存在数据库中的特殊的数据库对象,
需要执行相应功能时就可以直接通过“函数名”、“存储过程”调用其中的代码,以提高执行效率和代码的复用性。
二、 函数和存储过程的不同点:
1、函数在定义部分有returns指定返回值类型,同时在函数体中必须使用return语句返回结果;存储过程则在函数参数位置通过输入或输出参数向外输出结果而不能使用返回值return返回结果。
2、存储过程的参数有IN、OUT、INOUT(传入传出)作为指定参数的传递方向;而函数的参数通常都是IN方向,通常可以省略不写。
3、函数可以在任意的语句中调用,但存储过程需要通过call来调用。
4、函数通常是一些固定功能的代码合集,具有一定的通用性,数据库开发者定义了许多函数可以使用,但存储过程通常需要我们自己根据项目定义。
三、自定义函数的定义和使用
所有的数据库管理系统都提供了许多系统函数,已经足够我们使用,但它也提供我们可以自定义函数的途径,以下是有关自定义函数的内容。
1、 自定义函数的语法:
DELIMITER $$ -- 定界符,将默认的语句结束符设置为$$
CREATE FUNCATION <函数名> (参数名 参数数据类型(长度)) returns 返回值类型
BEGIN
#函数的实现部分(函数体)
END $$
DELIMITER ; -- 将定界符改回来 函数案例:
-- 定义函数
DELIMITER $$
CREATE FUNCTION func_hello(name VARCHAR(20))
RETURNS VARCHAR(20)
BEGIN
RETURN CONCAT("您好",name);
END $$
DELIMITER ; -- 调用函数,出入参数给name
SELECT func_hello("张三"); -- 删除函数
drop FUNCTION func_hello; 三、 存储过程的定义和使用
1、语法:
DELIMITER $$ -- 定界符,将默认的语句结束符设置为$$
CREATE PROCEDUCE<存储过程名> (传递方向 参数名 参数数据类型(长度)) BEGIN
#存储过程的实现部分(存储过程体)
END $$
DELIMITER ; -- 将定界符改回来 2、 存储过程的案例1:入门
-- 查询成绩表中成绩合格的记录数,通过传出参数传递给调用者
DROP PROCEDURE IF EXISTS proc_score_count;
DELIMITER $$
CREATE PROCEDURE proc_score_count(OUT result INT(3))
BEGIN
DECLARE num INT(10) DEFAULT 10; -- 定义局部变量,后面可加默认值
SELECT COUNT(*) INTO result
FROM tb_score WHERE student_score > '';
END $$
DELIMITER ; -- 调用存储过程
CALL proc_score_count(@及格人数); -- @表示一个全局变量,用于接收存储过程输出的值 -- 查看返回结果,通过select语句查看全局变量
SELECT @及格人数; -- 删除存储过程
DROP PROCEDURE proc_score_count; 3、 存储过程:在存储过程中定义局部变量
定义语法:DECLARE 变量名 数据类型(长度)[default 默认值];
赋值语法:SET 变量名 = 值|表达式;
说明:定义局部变量的语句必须是存储过程体中的第一行语句,之前
不能再有其他语句。
4、 存储过程的案例2:在存储过程中定义局部变量
-- 向tb_grade表中插入一条记录,需要传入字段的值
DROP PROCEDURE IF EXISTS proc_insertgrade;
DELIMITER $$
CREATE PROCEDURE proc_insertgrade(IN grade_name VARCHAR(10))
BEGIN
DECLARE name1 VARCHAR(10); -- 定义局部变量,后面可加默认值
SET name1 = grade_name;
INSERT INTO tb_grade VALUES (null,name1);
END $$
DELIMITER ; -- 调用存储过程
CALL proc_insertgrade('六年级'); SELECT * FROM tb_grade ORDER BY grade_id;
5、 存储过程的案例3:流程控制语句(IF)
语法:
IF <条件表达式1> THEN
#语句块1
[ELSEIF <条件表达式2>THEN
#语句块2
END IF;
。。。。。。。]
END IF;
案例:
-- 案例描述:用户输入“课程编号”,查询对应编号的成绩
DROP PROCEDURE IF EXISTS proc_selectscore_if;
DELIMITER //
CREATE PROCEDURE proc_selectscore_if(IN id INT(3))
BEGIN
IF id = 1 THEN
SELECT * FROM tb_score WHERE subject_id = 1;
ELSEIF id = 2 THEN
SELECT * FROM tb_score WHERE subject_id = 2;
ELSEIF id = 3 THEN
SELECT * FROM tb_score WHERE subject_id = 3;
ELSE
SELECT '您的输入有误!' FROM DUAL; -- 从虚拟表,orcale写法
END IF;
END //
DELIMITER ; CALL proc_selectscore_if(4);
6、 存储过程的案例4:流程控制语句(case)
语法:
CASE <常量>
WHEN 值1 THEN
#语句块1
WHEN 值2 THEN
#语句块3
[ELSE #语句块N]
END CASE;
案例 DROP PROCEDURE IF EXISTS proc_selectscore_case;
DELIMITER //
CREATE PROCEDURE proc_selectscore_case(IN id INT(3))
BEGIN
CASE id
WHEN 1 THEN
SELECT * FROM tb_score WHERE subject_id = 1;
WHEN 2 THEN
SELECT * FROM tb_score WHERE subject_id = 2;
WHEN 3 THEN
SELECT * FROM tb_score WHERE subject_id = 3;
ELSE
SELECT '您的输入有误!' FROM DUAL;
END case;
END //
DELIMITER ; CALL proc_selectscore_case(3); 7、 存储过程的案例5:流程控制语句(loop循环)
语法:
循环标志:loop
[LEAVE循环标志;] 相当于break,结束整个循环
[ITERATE循环标志;] 相当于continue,跳过当前单次循环,进入下一次循环 -- ITERATE迭代
END loop;
说明:
1、 loop循环以“循环标志:loop开始“,以“END:loop结束“
案例:
-- 案例描述:输出1-最大值之间的奇数
DROP PROCEDURE IF EXISTS proc_loop;
DELIMITER //
CREATE PROCEDURE proc_loop(IN MAX INT(3))
BEGIN
DECLARE num INT(3) DEFAULT 0;
xh:LOOP
SET num = num + 1; /*更新变量*/
IF num>max THEN
LEAVE xh;
END IF;
IF MOD(num,2) = 0 THEN
ITERATE xh; END IF;
SELECT CONCAT("第",num,"次输出");
END loop;
END //
DELIMITER ; CALL proc_loop(6);
mysql 09章_存储过程和函数的更多相关文章
- MySql(三)存储过程和函数
MySql(三)存储过程和函数 一.什么是存储过程和函数 二.存储过程和函数的相关操作 一.什么是存储过程和函数 存储过程和函数是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程和函数 ...
- MySQL主从环境下存储过程,函数,触发器,事件的复制情况
下面,主要是验证在MySQL主从复制环境下,存储过程,函数,触发器,事件的复制情况,这些确实会让人混淆. 首先,创建一张测试表 mysql),age int); Query OK, rows affe ...
- MySQL视图view/存储过程和函数的使用
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p. ...
- 【MySQL】MySQL(三)存储过程和函数、触发器、事务
MySQL存储过程和函数 存储过程和函数的概念 存储过程和函数是 事先经过编译并存储在数据库中的一段 SQL 语句的集合 存储过程和函数的好处 存储过程和函数可以重复使用,减轻开发人员的工作量.类似于 ...
- MySQL 05章_模糊查询和聚合函数
在之前的查询都需要对查询的关机中进行“精确”.“完整”完整的输入才能查询相应的结果, 但在实际开发过程中,通常需要考虑用户可能不知道“精确”.“完整”的关键字, 那么就需要提供一种不太严格的查询方式, ...
- Mysql的视图、存储过程、函数、索引全解析
视图是查询命令结果构成的一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集合,并可以当作表来查询使用. 1创建视图 --格式:C ...
- MySQL 11章_索引、触发器
一. 索引: . 为什么要使用索引: 一本书需要目录能快速定位到寻找的内容,同理,数据表中的数据很多时候也可以为他们创建相应的“目录”,称为索引,当创建索引后查询数据也会更加高效 . Mysql中的索 ...
- mysql 06章_分组查询和链接查询
一.分组查询 在进行查询时,通常需要按某个或某些字段进行一些统计,因此就需要使用分组查询,但分组后通常需要与聚合函数使用,分组才有意义. 语法:SELECT <字段列表|*> FROM 表 ...
- MySQL 10章_视图、事务
一. 视图: 视图(view)是保存了查询语句的一种数据库对象,其数据来源是查询语句对应的数据表,他的结果与数据表查询的结果一样也是一张虚拟的数据表 . 为什么需要视图: ) 不同的用户关心的数据可能 ...
随机推荐
- 【hive 日期函数】Hive常用日期函数整理
1.to_date:日期时间转日期函数 select to_date('2015-04-02 13:34:12');输出:2015-04-02122.from_unixtime:转化unix时间戳到当 ...
- 您应升级到 MySQL 5.5.0 或更高版本。 phpmyadmin
最近又折腾LAMP了.从官方下载的phpmyadmin在部署的时候发现 “您应升级到 MySQL 5.5.0 或更高版本”.原因是我安装的mysql数据库版本过低. 解决思路: 1.升级mysql版本 ...
- 内存Zone中的pageset成员分析
1: struct per_cpu_pageset __percpu *pageset; 首先,分析一个函数,__free_pages,这个函数是Buddy System提供的API接口函数,用于翻译 ...
- [已解决]报错UnicodeDecodeError
输出报错: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc4 in position 220: in 解决方案:将编码方式utf-8 修 ...
- pytest-文件名类名方法名执行部分用例
pytest test_class_01.py 执行文件名 pytest -v -s test_class_01.py 执行文件名 pytest -v test_class_01.py::TestCl ...
- Size Assert
判断返回内容的大小
- (Struts2学习系列二)Struts2动态方法调用:指定method属性
紧接着上一篇,在HelloWorldAction.java中添加add和update方法: public class HelloWorldAction extends ActionSupport{ p ...
- windows下安装jenkins初级(2)
这里是基于gitlab拉取代码 gitlab暂时先不多介绍 我们需要把git和gitlab连接起来方便拉取代码 所以需要git的ssh公匙和私匙 首先在 https ...
- dubbo入门之服务消费
今天,我们来看看dubbo消费的执行过程 首先,我们都知道dubbo是一个基于netty实现的RPC框架,底层通信是使用netty来实现的.在学习dubbo的时候,或许我们都会有下面的这些疑惑: 1. ...
- *args和**kwargs用法
''' @Date: 2019-10-10 21:14:56 @LastEditors: 冯浩 @LastEditTime: 2019-10-20 22:38:16 ''' def func(*arg ...