窥探mysql存储过程细节

作者:迹忆 时间:2024-01-13 07:27:52 

存储过程,可以这样认为,将我们需要特殊处理的sql语句封装成函数,当需要的时候我们只需调用这个函数就可以实现我们想要的操作,这个过程我们可以称之为存储过程。当然了,真正存储过程的定义不是这样的。但是我们可以这样简单的去理解存储过程。

下面我们看一个简单的使用存储过程的例子。

首先我们新建一张表 proced:


create table proced(
    id int(5) primary key auto_increment,
    name varchar(50),
    type varchar(50)
);

然后我们需要向这个表中插入10万条数据,这个时候我们需要借助存储过程来实现这一功能。


mysql> delimiter //
mysql> create procedure adddata()
    -->begin
    -->declare n int default 0;
    -->while n<100000
    -->do
    -->insert into proced(name,type) values(‘迹忆博客','onmpw');
    -->set n = n+1;
    -->end while;
    -->end
    -->//
mysql> delimiter ;
mysql> call adddata();

使用上述存储过程,我们就可以向proced表中插入10万条数据了。

借助上述小例子,我们来讲一下如何创建一个存储过程。

创建存储过程

首先我们来看一下创建存储过程的语法:


CREATE PROCEDURE procedure_name(IN/OUT/INOUT parameter TYPE)
BEGIN
    procedure_body
END

这个过程比较简单。

在上面的小例子中我们看到在创建存储过程之前使用了delimiter //;,创建完成之后又再次 使用了命令 delimiter ;。

delimiter 是界定符,我们知道,在mysql命令行客户端,是通过分号(;)来界定一个命令是否完成的。在存储过程中,我们会多次使用到分号,但是这并不代表命令的结束,所以说我们需要使用delimiter命令来改变这个界定符。


mysql> delimiter //;  改变界定符为 //
mysql> delimiter ; 重新改变界定符为分号

所以说我们如果使用mysql命令行创建存储过程的话,我们必须在创建存储过程之前使用上述命令改变界定符。

接下来我们看到procedure_name()中的IN/OUT/INOUT,这是代表什么意思呢?

一个IN类型的参数会传递一个值到存储哦过程中,也就是我们在编程语言中自定义函数的参数。如果参数前面没有指定是IN/OUT/INOUT,那默认会是IN,看下面的例子:


mysql>delimiter //
mysql> create procedure in_proced(IN param VARCHAR(100))
     -->begin
     -->insert into proced(name,type) values(param,'onmpw');
     -->end
     -->//
mysql>delimiter ;
mysql> call in_proced(‘onmpw.com');

这就是在参数前指定IN的含义。

下面我们看OUT,指定为OUT的参数将从存储过程中传递一个值给调用者,也就是说,OUT可以认为这个参数就是我们自定义函数中的返回值。


mysql> delimiter //
mysql> create procedure out_proced(OUT param INT)
    -->begin
    -->select count(*) into param from proced;
    -->end
    -->//
mysql>delimiter ;
mysql> call out_proced(@a);
mysql>select @a;
+------+
| @a |
+------+
| 3   |
+------+

最后就是INOUT,很明显INOUT指定的参数被调用者初始化,其值在存储过程中可以被修改,并且任何改变对于调用者来说都是可见的。

看下面的例子:


mysql> delimiter //
mysql> create procedure inout_proced(INOUT param INT)
    --> begin
    --> select count(*) into param from proced where id>param;
    --> end
    -->//
mysql>delimiter ;
mysql>set @a = 3;
mysql>call inout_proced(@a);
mysql>select @a; 查看变量的值是否改变

删除存储过程

删除存储过程的语法:

DROP PROCEDURE IF EXISTS procedure_name

下面是使用实例:

mysql>drop procedure if exists proced;

修改存储过程

存储过程的修改时不能改变存储过程内的sql语句的,只能改变其属性,其语法如下:


ALTER PROCEDURE proc_name [characteristic ...]

characteristic:
 COMMENT 'string'
 | LANGUAGE SQL
 | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
 | SQL SECURITY { DEFINER | INVOKER }

总结:无论是删除存储过程还是修改存储过程,必须保证你要修改或者删除存储过程没有被其他存储过程使用,例如你有存储过程A,和存储过程B。A在B中被使用,如果我们想修改A或者删除A,必须确保B中不再使用A,否则如果我们删除A以后,再调用B的时候就会报错。

举个例子:


mysql>delimiter //
mysql>create procedure A(IN pa1 INT,OUT pa2 INT)
    -->begin
    -->select count(*) into pa2 from proced where id>pa1;
    -->end
    -->//
mysql>create procedure B(INOUT pa INT)
    -->begin
    -->declare v int;
    -->call A(pa,v);
    -->set pa = v;
    -->end
    -->//
mysql>delimiter ;
mysql>drop procedure A;
mysql>set @a=5;
mysql>call B(@a);
ERROR 1305 (42000): PROCEDURE test.A does not exists

标签:mysql,存储过程
0
投稿

猜你喜欢

  • Javascript学习第一季 三

    2008-06-27 13:08:00
  • Vue结合Video.js播放m3u8视频流的方法示例

    2023-07-02 16:55:40
  • django使用django-apscheduler 实现定时任务的例子

    2021-06-09 05:10:44
  • Python+Pygame编写一个Pong游戏

    2023-08-04 15:58:31
  • Python2和Python3之间的str处理方式导致乱码的讲解

    2022-10-01 09:46:53
  • JavaScript中实现块作用域的方法

    2024-04-16 10:38:39
  • 关于Python中的if __name__ == __main__详情

    2022-05-04 10:16:28
  • MySQL索引知识的一些小妙招总结

    2024-01-13 18:16:39
  • NodeJs Express框架操作MongoDB数据库执行方法讲解

    2024-01-25 08:59:08
  • Mybatis的where标签使用总结梳理

    2024-01-17 01:56:18
  • Python内置函数之filter map reduce介绍

    2023-01-18 21:07:16
  • rs.open与conn.execute详细解释

    2008-07-03 12:54:00
  • ASP.NET MVC4入门教程(二):添加一个控制器

    2024-05-11 09:26:25
  • MySQL Version确认问题(版本确认)

    2024-01-19 15:20:47
  • python查找与排序算法详解(示图+代码)

    2023-08-05 13:27:26
  • 基于Django与ajax之间的json传输方法

    2023-01-12 19:52:58
  • TensorFlow神经网络学习之张量与变量概念

    2023-07-06 20:58:02
  • GoLang bytes.Buffer基础使用方法详解

    2024-04-27 15:28:09
  • Sun拟10亿美元收购MySQL

    2008-01-17 11:56:00
  • python3实现字符串操作的实例代码

    2023-08-23 06:24:31
  • asp之家 网络编程 m.aspxhome.com