存储过程是数据库的一个重要的功能,MySQL 5.0以前并不支持存储过程,这使得MySQL在应用上大打折扣。好在MySQL 5.0开始支持存储过程,这样即可以大大提高数据库的处理速度,同时也可以提高数据库编程的灵活性。

MySQL存储过程的创建

    语法

CREATE PROCEDURE  过程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]]) [特性 ...] 过程体

 

DELIMITER //
  CREATE PROCEDURE myproc(OUT s int)
    BEGIN
      SELECT COUNT(*) INTO s FROM students;
    END
    //
DELIMITER ;

  MySQL默认以";"为分隔符,如果没有声明分割符,则编译器会把存储过程当成SQL语句进行处理,因此编译过程会报错,所以要事先用“DELIMITER //”声明当前段分隔符,让编译器把两个"//"之间的内容当做存储过程的代码,不会执行这些代码;“DELIMITER ;”的意为把分隔符还原。

    参数

    存储过程根据需要可能会有输入、输出、输入输出参数,如果有多个参数用","分割开。MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT:

IN参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值OUT:该值可在存储过程内部被改变,并可返回INOUT:调用时指定,并且可被改变和返回

    过程体

    过程体的开始与结束使用BEGIN与END进行标识。

MySQL实例与讲解

1. 创建一存储过程,求l+2+3+…+n,并打印结果。

先使用MySQL语句创建存储过程,再使用call语句调用这一存储过程查看结果,可以看到由于未输入n的值,sum结果为0。

DELIMITER //
CREATE PROCEDURE addresult()
    BEGIN
    DECLARE i INT;
    DECLARE sum INT;
    DECLARE n INT;

    SET i = 1;
    SET sum = 0;

    WHILE i <= n DO
        SET sum = sum + i;
        SET i = i + 1;
    END WHILE;
    SELECT SUM;
    END
        //
DELIMITER ;

 

在navicat 实现

MySQL的CDC怎么配置StorageFileName mysql inc_全局变量

MySQL的CDC怎么配置StorageFileName mysql inc_存储过程_02

 

 

 

 2.调用上面的addresult存储过程,打印l十2+3+…+10的结果。

在第一题的addresult过程基础上,加上一条“set n=10”语句,设定n的值,调用该过程后打印结果,可以看到结果为sum=1+2+3+...+10=55。

MySQL的CDC怎么配置StorageFileName mysql inc_存储过程_03

MySQL的CDC怎么配置StorageFileName mysql inc_MySQL_04

 

 

 

3. 修改上述存储过程为addresult1,使得n为输入参数,其具体值由用户调用此存储过程时指定。

MySQL的CDC怎么配置StorageFileName mysql inc_全局变量_05

MySQL的CDC怎么配置StorageFileName mysql inc_全局变量_06

 

MySQL的CDC怎么配置StorageFileName mysql inc_存储过程_07

 

这是输入10的结果

也可以这样写,这样更简洁

MySQL的CDC怎么配置StorageFileName mysql inc_存储过程_08

 

 

 

 

 

4.调用上面修改后的addresult1存储过程,打印l+2+3+…+100的结果。

 

 

MySQL的CDC怎么配置StorageFileName mysql inc_MySQL_09

 

 

 

 

 

 

 

 

5. 修改上述存储过程为addresult2,将n参数设定默认值为100,并改设sum为输出参数,让主程序能够接收计算结果。

将3中存储过程中的“in n int”修改为“out sum int”,并在存储过程中设定n默认值为100。

 

MySQL的CDC怎么配置StorageFileName mysql inc_存储过程_10

 

 

 

MySQL的CDC怎么配置StorageFileName mysql inc_存储过程_11

 

 

 

MySQL的CDC怎么配置StorageFileName mysql inc_全局变量_12

 

 或者手动输入值

MySQL的CDC怎么配置StorageFileName mysql inc_MySQL_13

MySQL的CDC怎么配置StorageFileName mysql inc_全局变量_14

MySQL的CDC怎么配置StorageFileName mysql inc_全局变量_15

 

 

 

如何接受返回参数的值呢?这里涉及到MySQL的变量

MySQL变量一共有三种:

全局变量

全局变量又叫内置变量,是mysql数据库内置的变量 ,对所有连接都起作用。

查看所有全局变量: show variables

查看某个全局变量: select @@变量名

修改全局变量: set 变量名=新值

character_set_client: mysql服务器的接收数据的编码

character_set_results:mysql服务器输出数据的编码

会话变量

只存在于当前客户端与数据库服务器端的一次连接当中。如果连接断开,那么会话变量全部丢失!

定义会话变量: set @变量=值

查看会话变量: select @变量

局部变量

在存储过程中使用的变量就叫局部变量。只要存储过程执行完毕,局部变量就丢失。

回到上面这个存储过程,如何接受返回参数的值呢?

定义一个会话变量name, 使用name会话变量接收存储过程的返回值

CALL pro_testOut(@NAME);

查看变量值

SELECT @NAME;

OUT修饰的参数,调用时就是这样,如果你传入一个常量,就会报错

 

 参数inout的使用(既能输入一个值又能传出来一个值)

 传一个年龄,自动让年龄增长10岁

MySQL的CDC怎么配置StorageFileName mysql inc_存储过程_16

 

MySQL的CDC怎么配置StorageFileName mysql inc_MySQL_17

 

 

MySQL的CDC怎么配置StorageFileName mysql inc_MySQL_18

 

 

怎么OUT呢?例如

@abcd是没有事先定义的变量,是NULL值

这里直接调用的话也是为NULL

@abc是之前out的值,所以调用加10等于5060

MySQL的CDC怎么配置StorageFileName mysql inc_MySQL_19

 

 

这样看会更清晰

定义@ab=1,然后调用加10,得出11,这个也变量可以继续调用

 

 

 

MySQL的CDC怎么配置StorageFileName mysql inc_全局变量_20

MySQL的CDC怎么配置StorageFileName mysql inc_全局变量_21