MySQL数据库之存储过程 procedure

目录
  • 1、存储过程与函数的区别
    • 1.1、相同点
    • 1.2、不同点
  • 2、存储过程的操作
    • 2.1、创建过程
    • 2.2、查看过程
    • 2.3、调用过程
    • 2.4、删除过程
  • 3、存储过程的形参类型

前言:

stored procedure 完成特定功能的SQL语句集,存储在数据库中,经过第一次编译之后再次调用不需要编译(效率较高)

1、存储过程与函数的区别

1.1、相同点

  • 都是为了可重复地执行操作数据库的SQL语句集合
  • 都是一次编译,多次执行

1.2、不同点

  • 标识符不同,函数function 过程 procedure
  • 函数中有返回值,且必须返回,而过程没有返回值
  • 过程无返回值类型,不能将结果直接赋值给变量;函数有返回值类型,调用时,除了在select中,必须将返回值赋值给变量
  • 函数可以再select语句中直接使用,而过程不能

2、存储过程的操作

2.1、创建过程

基本语法:

create procedure 过程名字([参数列表])
bengin
    过程体
end
结束符

如果只有只有一条指令可以省略begin和end

create procedure my_pro1()
select * from my_student;

过程基本上可以完成函数对应的所有功能:

-- 修改语句结束符
delimiter $$
-- 创建过程
create procedure my_pro2()
begin
    -- 求1到100之间的和
    -- 创建局部变量
    declare i int default 1;
    -- declare sum int default 0;
    -- 会话变量
    set @sum = 0;
    -- 开始循环获取结果
    while i <= 100 do
        -- 求和
        set @sum = @sum + i;
        set i = i + 1;
    end while;

    -- 显示结果
    select @sum;
end
$$
delimiter ;

2.2、查看过程

-- 查看所有存储过程
show procedure status [like 'pattern'];
-- 查看过程的创建语句
show create procedure 过程名字\G

2.3、调用过程

过程没有返回值

基本语法:

call 过程名([实参列表]);
-- eg:
call my_pro2();
+------+
| @sum |
+------+
| 5050 |
+------+

2.4、删除过程

基本语法:

drop procedure 过程名;

3、存储过程的形参类型

存储过程的参数和函数一样,需要制定其类型

但是存储过程对参数还有额外的要求,自己的参数分类:

  • in:(值传递)参数从外部传入,在过程内部使用,可以是直接数据,也可以是保存数据的变量
  • out:(引用传递)参数在过程中赋值,传入必须是变量,如果有外部数据,会被清空为null
  • inout:(引用传递)数据可以从外部传入过程内部使用,同时内部操作之后,又回将数据返回给外部

代码示例:

-- 创建3个会话变量
set @var1 = 1;
set @var2 = 2;
set @var3 = 3;
-- 查询会话变量
select @var1, @var2, @var3;
+-------+-------+-------+
| @var1 | @var2 | @var3 |
+-------+-------+-------+
|     1 |     2 |     3 |
+-------+-------+-------+
1 row in set (0.00 sec)
-- 修改语句结束符
delimiter $$
-- 定义过程
create procedure my_pro3(in a int, out b int, inout c int)
begin
    -- 查看传入的3个数据值
    select a, b, c;
    -- +------+------+------+
    -- | a    | b    | c    |
    -- +------+------+------+
    -- |    1 | NULL |    3 |
    -- +------+------+------+
    -- 修改3个变量值
    set a = 10;
    set b = 20;
    set c = 30;
    select a, b, c;
    -- +------+------+------+
    -- | a    | b    | c    |
    -- +------+------+------+
    -- |   10 |   20 |   30 |
    -- +------+------+------+
    -- 查看会话变量
    select @var1, @var2, @var3;
    -- +-------+-------+-------+
    -- | @var1 | @var2 | @var3 |
    -- +-------+-------+-------+
    -- |     1 |     2 |     3 |
    -- +-------+-------+-------+
    -- 修改会话变量
    set @var1 = 'a';
    set @var2 = 'b';
    set @var3 = 'c';
    select @var1, @var2, @var3;
    -- +-------+-------+-------+
    -- | @var1 | @var2 | @var3 |
    -- +-------+-------+-------+
    -- | a     | b     | c     |
    -- +-------+-------+-------+
end
$$
delimiter ;
-- 调用过程
call my_pro3(@var1, @var2, @var3);

-- 再次查看会话变量
mysql> select @var1, @var2, @var3;
+-------+-------+-------+
| @var1 | @var2 | @var3 |
+-------+-------+-------+
| a     |    20 |    30 |
+-------+-------+-------+

分析:

  • 1、实参传入过程之后,实际上没有改变外部变量的值,而是把值给了形参,out类型不能接收外部变量的值,默认为null
  • 2、当过程执行到end 的时候,如果是out或inout变量,会将形参的值重新赋值给实参变量
(0)

相关推荐

  • MySQL 5.7 create VIEW or FUNCTION or PROCEDURE

    1.视图 a. CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`localhost` SQL SECURITY INVOKER VIEW `sakila`.`actor_info` AS SELECT `a`.`actor_id` AS `actor_id`, `a`.`first_name` AS `first_name`, `a`.`last_name` AS `last_name`, GROUP_CONCAT(DISTINCT CONCAT(`

  • MySQL利用procedure analyse()函数优化表结构

    简介 procedure analyse()函数是MySQL内置的对MySQL字段值进行统计分析后给出建议的字段类型. 语法 procesure analyse(max_elements,max_memory) max_elements 指定每列非重复值的最大值,当超过这个值的时候,MySQL不会推荐enum类型. max_memory analyse()为每列找出所有非重复值所采用的最大内存大小. 实战演练 # 对t1表所有的列进行分析 wing@3306>show create table

  • mysql存储过程之创建(CREATE PROCEDURE)和调用(CALL)及变量创建(DECLARE)和赋值(SET)操作方法

    本文实例讲述了mysql存储过程之创建(CREATE PROCEDURE)和调用(CALL)及变量创建(DECLARE)和赋值(SET)操作方法.分享给大家供大家参考,具体如下: 存储过程创建(CREATE PROCEDURE)和调用(CALL) 这个咱就不说什么定义啦术语啦啥的,直接看着实例来慢慢熟悉它.完事呢,咱们来创建一个名为GetAllProducts()的简单存储过程哈,这个GetAllProducts()存储过程呢,主要是用来从products表中选择所有产品.咱们来启动 mysql

  • 详解MYSQL中重命名procedure的一种方法

    最近有用到对存储过程(procedure)重命名的功能,在网上找了一下资料都没有讲到在mysql中是如何实现的,当然可以删掉再重建,但是应该有别的方法,在"mysql"这个数据库(自带)中找了一下,发现两张表:func.proc,发现func表是空的,proc表记录了有关procedure和function有关的信息. 尝试对proc表进行更新,重命名成功了! 总结 以上所述是小编给大家介绍的MYSQL中重命名procedure的一种方法,希望对大家有所帮助,如果大家有任何疑问请给我留

  • php mysql procedure实现获取多个结果集的方法【基于thinkPHP】

    本文实例讲述了php mysql procedure实现获取多个结果集的方法.分享给大家供大家参考,具体如下: protected function getRs($id) { $db = new mysqli(C("DB_HOST"), C("DB_USER"), C("DB_PWD"), C("DB_NAME"), C("DB_PORT")); if (mysqli_connect_errno()) th

  • MySQL数据库之存储过程 procedure

    目录 1.存储过程与函数的区别 1.1.相同点 1.2.不同点 2.存储过程的操作 2.1.创建过程 2.2.查看过程 2.3.调用过程 2.4.删除过程 3.存储过程的形参类型 前言: stored procedure 完成特定功能的SQL语句集,存储在数据库中,经过第一次编译之后再次调用不需要编译(效率较高) 1.存储过程与函数的区别 1.1.相同点 都是为了可重复地执行操作数据库的SQL语句集合 都是一次编译,多次执行 1.2.不同点 标识符不同,函数function 过程 procedu

  • MSSQL MySQL 数据库分页(存储过程)

    先看看单条 SQL 语句的分页 SQL 吧. 方法1: 适用于 SQL Server 2000/2005 复制代码 代码如下: SELECT TOP 页大小 * FROM table1 WHERE id NOT IN ( SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id ) ORDER BY id 方法2: 适用于 SQL Server 2000/2005 复制代码 代码如下: SELECT TOP 页大小 * FROM table1 WHERE

  • 在Mysql数据库里通过存储过程实现树形的遍历

    关于多级别菜单栏或者权限系统中部门上下级的树形遍历,oracle中有connect by来实现,mysql没有这样的便捷途径,所以MySQL遍历数据表是我们经常会遇到的头痛问题,下面通过存储过程来实现. 1,建立测试表和数据: DROP TABLE IF EXISTS csdn.channel; CREATE TABLE csdn.channel ( id INT(11) NOT NULL AUTO_INCREMENT, cname VARCHAR(200) DEFAULT NULL, pare

  • Mysql数据库存储过程基本语法讲解

    drop procedure sp_name// 在此之前,小编给大家讲述过MYSQL语法的基本知识,本篇内容,小编通过下面的一个实例,给读者们通过实战中的代码讲解一下基本语法的知识. 一般情况下MYSQL以:结尾表示确认输入并执行语句,但在存储过程中:不是表示结束,因此可以用该命令将:号改为//表示确认输入并执行.存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. 一.创建存储过程 1.基本语法: create procedure sp_name() be

  • MySQL数据库实验之 触发器和存储过程

    目录 一.实验目的 二.实验要求 三.实现内容及步骤 1.创建一个不带参数的简单存储过程 2.创建一个带输入参数的存储过程 3.创建一个带输入输出参数的存储过程 4.触发器的创建与使用 四.实验总结 观前提示:本篇内容为mysql数据库实验,代码内容经测试过,可能一小部分有所疏漏,也有会不符合每个人实验的要求的地方,因此以下内容建议仅做思路参考. 一.实验目的 1.掌握某主流DBMS支持的SQL编程语言和编程规范,规范设计存储过程: 2.能够理解不同类型触发器的作用和执行原理,验证触发器的有效性

  • MySQL数据库21条最佳性能优化经验

    今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情. 当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库.希望下面的这些优化技巧对你有用. 1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被M

  • MySQL实现创建存储过程并循环添加记录的方法

    本文实例讲述了MySQL实现创建存储过程并循环添加记录的方法.分享给大家供大家参考,具体如下: 先创建,然后调用: -- 创建存储过程 DELIMITER;// create procedure myproc() begin declare num int; set num=1; while num <= 24 do insert into t_calendar_hour(hourlist) values(num); set num=num+1; end while; commit; end;/

  • Mysql数据库性能优化一

    今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库. mysql的性能优化无法一蹴而就,必须一步一步慢慢来,从各个方面进行优化,最终性能就会有大的提升. Mysql数据库的优化技术 对mysql优化是

  • MySQL数据库优化技术之索引使用技巧总结

    本文实例总结了MySQL数据库优化技术的索引用法.分享给大家供大家参考,具体如下: 这里紧接上一篇<MySQL数据库优化技术之配置技巧总结>,进一步分析索引优化的技巧: (七)表的优化 1. 选择合适的数据引擎 MyISAM:适用于大量的读操作的表 InnoDB:适用于大量的写读作的表 2.选择合适的列类型 使用 SELECT * FROM TB_TEST PROCEDURE ANALYSE()可以对这个表的每一个字段进行分析,给出优化列类型建议 3.对于不保存NULL值的列使用NOT NUL

随机推荐