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

    1. Bochs中的调试命令ldsym没有触发的情况. 参考:http://www.ibm.com/developerworks/cn/linux/sdk/lex/ Lex 代表 Lexical An ...

  2. mybatis执行test07测试类却显示test05测试类调用的sql语句出错

    1.测试类 @Test public void test07() { IStudentDao studentDao = new IStudentDaoImpl(); Student student = ...

  3. tty - 显示连接标准输入的终端的文件名

    总览 (SYNOPSIS) tty [OPTION]... 描述 (DESCRIPTION) 显示 连接 标准输入 的 终端 的 文件名. -s, --silent, --quiet 什么 都 不显示 ...

  4. Effective C++之条款2:尽量以const enum inline替换 #define

    本文的标题也可以改成“用编译器替换预处理器”: const double AspectRatio = 1.653; //最好使用上述代码替换下述代码: #define ASPECT_RATIO 1.6 ...

  5. Mysql事务学习笔记

    Mysql事务学习笔记 1.事务概述 事务是数据库的执行单元,它包含了一条或多条sql语句,进行的操作是要么全部执行,要么全部都不执行. 2.事务执行命令 语法格式: start transactio ...

  6. document.write()创建元素有缺陷,

    如果在页面加载完毕后,此时通过这种方式创建元素,那么页面上存在的所有内容全部被干掉.

  7. jdbc打印sql语句-p6spy配置

    @Configuration public class P6SpyConfig { /** * P6数据源包装, 打印SQL语句 */ @Bean public P6DataSourceBeanPos ...

  8. mfc中的_T

    mfc 中的字符串表示常用_T,意为text,定义为宏定义,可以方便的定义所有字符串为UNICODE(16位,长字符)或者ANSI(8位,短字符). 如果对于所有的字符串定义了_T并且定义了预处理标志 ...

  9. cmake -help

    { Usage cmake [options] <path-to-source>  cmake [options] <path-to-existing-build> Speci ...

  10. CF 398 E(动态规划)

    传送门: http://codeforces.com/problemset/problem/398/E 题解: 首先答案不超过2. 最长环=1时,ans=0 最长环=2时,ans=1 否则,ans=2 ...