一、    函数和存储过程的相同点:
      函数和存储过程都是事先预编译并保存在数据库中的特殊的数据库对象,
      需要执行相应功能时就可以直接通过“函数名”、“存储过程”调用其中的代码,以提高执行效率和代码的复用性。
二、 函数和存储过程的不同点:
      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章_存储过程和函数的更多相关文章

  1. MySql(三)存储过程和函数

    MySql(三)存储过程和函数 一.什么是存储过程和函数 二.存储过程和函数的相关操作 一.什么是存储过程和函数 存储过程和函数是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程和函数 ...

  2. MySQL主从环境下存储过程,函数,触发器,事件的复制情况

    下面,主要是验证在MySQL主从复制环境下,存储过程,函数,触发器,事件的复制情况,这些确实会让人混淆. 首先,创建一张测试表 mysql),age int); Query OK, rows affe ...

  3. MySQL视图view/存储过程和函数的使用

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p. ...

  4. 【MySQL】MySQL(三)存储过程和函数、触发器、事务

    MySQL存储过程和函数 存储过程和函数的概念 存储过程和函数是 事先经过编译并存储在数据库中的一段 SQL 语句的集合 存储过程和函数的好处 存储过程和函数可以重复使用,减轻开发人员的工作量.类似于 ...

  5. MySQL 05章_模糊查询和聚合函数

    在之前的查询都需要对查询的关机中进行“精确”.“完整”完整的输入才能查询相应的结果, 但在实际开发过程中,通常需要考虑用户可能不知道“精确”.“完整”的关键字, 那么就需要提供一种不太严格的查询方式, ...

  6. Mysql的视图、存储过程、函数、索引全解析

    视图是查询命令结果构成的一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集合,并可以当作表来查询使用. 1创建视图 --格式:C ...

  7. MySQL 11章_索引、触发器

    一. 索引: . 为什么要使用索引: 一本书需要目录能快速定位到寻找的内容,同理,数据表中的数据很多时候也可以为他们创建相应的“目录”,称为索引,当创建索引后查询数据也会更加高效 . Mysql中的索 ...

  8. mysql 06章_分组查询和链接查询

    一.分组查询 在进行查询时,通常需要按某个或某些字段进行一些统计,因此就需要使用分组查询,但分组后通常需要与聚合函数使用,分组才有意义. 语法:SELECT <字段列表|*> FROM 表 ...

  9. MySQL 10章_视图、事务

    一. 视图: 视图(view)是保存了查询语句的一种数据库对象,其数据来源是查询语句对应的数据表,他的结果与数据表查询的结果一样也是一张虚拟的数据表 . 为什么需要视图: ) 不同的用户关心的数据可能 ...

随机推荐

  1. 大数运算之 Java BigInteger 的基本用法

    大数运算之 Java BigInteger 的基本用法 在程序设计竞赛中会遇到高精度运算的问题,C++没有高精度运算,只能手动模拟人工运算,手动实现高精度,而 java.math 包中的 BigInt ...

  2. 一文看懂SATA和NVMe固态硬盘用起来有何区别?

    本文摘自:https://www.sohu.com/a/203688929_615464 NVMe固态硬盘正在逐步扩张,而包括三星.东芝在内的大厂并没有停止SATA固态硬盘新品的研发.到底那种固态硬盘 ...

  3. 矢量切片应用中geoserver与geowebcache分布式部署方案

    在进行GIS项目开发中,常使用Geoserver作为开源的地图服务器,Geoserver是一个JavaEE项目,常通过Tomcat进行部署.而GeoWebCache是一个采用Java实现用于缓存WMS ...

  4. Python生成腾讯云实时音视频的UserSig签名

    1.UserSig 简介 官方文档链接:https://cloud.tencent.com/document/product/647/16790 腾讯云 IM 的前身是 QQ 的即时通讯消息系统,我们 ...

  5. Vue之自建管理后台(二)Vue端设计

    我们先设计Vue的文件夹分布. 在此之前,我们先了解下初始化创建的Vue的文件夹 https://www.cnblogs.com/luoxuemei/p/9812151.html (我引用了这哥们写的 ...

  6. Swift与OC混合开发

    一.Swift调用OC 1. 创建{targetName}-Bridging-Header.h头文件,在BuildSetting -> bridging 2. Swift文件调用的OC中的类的头 ...

  7. Mysql优化-分区

    分区简介 分区是根据一定的规则,数据库把一个表分解成多个更小的.更容易管理的部分.就访问数据库应用而言,逻辑上就只有一个表或者一个索引,但实际上这个表可能有N个物理分区对象组成,每个分区都是一个独立的 ...

  8. Bash 脚本 set 命令教程

    http://www.ruanyifeng.com/blog/2017/11/bash-set.html set命令是 Bash 脚本的重要环节,却常常被忽视,导致脚本的安全性和可维护性出问题.本文介 ...

  9. 反编译字节码角度分析synchronized关键字的原理

    1.synchronized介绍 synchronized是java关键字.JVM规范中,synchronized关键字用于在线程并发执行时,保证同一时刻,只有一个线程可以执行某个代码块或方法:同时还 ...

  10. C# 简单的百度推送代码

    前段时间搞推送来着,安卓方面用到了百度的推送服务,由于只是简单的用到安卓推送的通知功能,所以没用百度推荐的C# SDK,通过借鉴网上的各种资料和百度的API,费了老大劲终于折腾出来一段能用的代码(早知 ...