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

    1. BIOS的虚拟化 xen的启动过程,与x86系统一样,首先要进入保护模式,然后安装中断处理程序. xen的中断处理程序可以分为几种,有的是直接分发给正在运行的操作系统,有的是分发给安装了硬件驱动 ...

  2. 剑指offer第二版面试题11:旋转数组的最小数字(JAVA版)

    题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数 ...

  3. PAT_A1028#List Sorting

    Source: PAT A1028 List Sorting (25 分) Description: Excel can sort records according to any column. N ...

  4. CentOS 7 启用中文输入法

    $HOME/.xinitrc LANG="zh_CN.UTF-8" exec startxfce4

  5. css过滤镜实现颜色渐变

    语法:filter : progid:DXImageTransform.Microsoft.Gradient ( enabled=bEnabled , startColorStr=iWidth , e ...

  6. 7年Java后端被淘汰,一路北漂辛酸史。。。

    作者:春天花会开foryou oschina.net/question/3465562_2281392 今天分享一位同行的经历: 本人Java开发6年半不到7年的样子. 英语专业,临毕业跟着隔壁专业去 ...

  7. 梯度提升树GBD

    转自 http://blog.csdn.net/u014568921/article/details/49383379 另外一个很容易理解的文章 :http://www.jianshu.com/p/0 ...

  8. vue computed 源码分析

    我们来看看computed的实现.最简单的一个demo如下: <html> <head> <meta http-equiv="Content-Type" ...

  9. 从零开始搭建系统1.7——FTP安装及配置

    1.安装vsftp软件包 [root@localhost usr]# yum install -y vsftpd 2.先备份vsftpd的默认配置文件 [root@localhost usr]# cd ...

  10. Java再谈方法

    1.3再谈方法 1.3.1 什么是方法(函数) ①方法是类或对象行为特征的抽象,也称为函数. ②Java里的方法不能独立存在,所有的方法必须定义在类里. 修饰符 返回值类型 方法名(参数类型 形参1, ...