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)是保存了查询语句的一种数据库对象,其数据来源是查询语句对应的数据表,他的结果与数据表查询的结果一样也是一张虚拟的数据表 . 为什么需要视图: ) 不同的用户关心的数据可能 ...
随机推荐
- 初探gitlab & gitlab-runner & asp.net core持续集成
文章简介 gitlab & gitlab-runner 简介 基于gitlab & gitlab-runner 的asp.net core webapi 极简持续集成实践 gitla ...
- Codeforces 1191A Tokitsukaze and Enhancement
题目链接:http://codeforces.com/problemset/problem/1191/A 思路:枚举 16 种情况输出最高的就行. AC代码: #include<bits/std ...
- Vue 学习笔记之 —— 组件(踩了个坑)
最近在学习vue,学习组件时,遇到了一个问题,困扰了半个多小时.. <!DOCTYPE html> <html lang="en"> <head> ...
- 类型转换、类型安全以及is和as的使用
class Program { static void Main(string[] args) { //1.类型转换 { //隐式转换:不需要转型,因为new返回一个Employee对象,而Objec ...
- 关于kettle
1.点spoon.bat无报错也不运行 可以运行一下spoonDebug.bat 查看一下spoondebug.txt日志 我遇到这个问题时 是给他分配的内存太多了 我的电脑只有2g 给果他给分了20 ...
- 自动化监控系统(三) 搭建xadmin做网站后台
Django有个自带的admin后台,不过界面不怎么好看,这里我用xadmin 我的python版本是3.5,可以使用支持py3的xadmin:https://github.com/sshwsfc/x ...
- node-fs(1) 无法从文件流内部读取到的字符串转化成json
先上一段代码 let fs=require('fs');//引入fs模块 let blob = fs.readFileSync('/node/product1/data.txt');//读取指定目录下 ...
- svg实现绘制路径动画
1,首先用svg绘制一条path路径,然后进行如下操作 ps: 下面是svg中两个属性及值的意义 stroke-dasharray是让你指定画出的线段每段的长度,第二个值是各段之间空隙的长度. str ...
- Web响应的提高
想象一下,如果用户在页面上触发一个点击事件,结果反应延迟比较明显,这将是一个令人沮丧的事情.而造成这个问题的原因就是响应延迟. 浏览器UI 线程 大家都知道浏览器的UI线程,大多数浏览器都是一个独立的 ...
- Spring中使用到的设计模式
1.工厂模式:Beanfactory和ApplicationContext 2.单例模式:bean的构建 3.代理模式:AOP 4.模板模式:jdbcTemplate,hibernateTemplat ...