MySQL存储过程之参数和复合语句

CREATE PROCEDURE p5 ([
    [ IN | OUT | INOUT ] name1 data-type ,
    ...                                                       ,
    [ IN | OUT | INOUT ] nameN data-type 
]) ... 

  参数列表可以为空,也可以有多个,关键词IN | OUT | INOUT,可省略,默认IN.

1. IN 输入的例子

mysql> CREATE PROCEDURE p5(p INT)
    SET @x = p //
mysql> CALL p5(12345)//
mysql> SELECT @x//

  上面代码执行后会显示输入的12345.过程体内将参数p的值赋值给会话变量x,然后调用过程并传递12345给参数p,调用完毕后显示会话变量@x.

  说明变量名前加@表示为会话变量,作用域为整个用户的会话周期.不加@表示用户自定义的局部变量.关于会话变量:

  1) 可以先在用户变量中保存值然后在以后引用它;这样可以将值从一个语句传递到另一个语句。

  2) 用户变量与连接有关,即一个客户端定义的变量不能被其它客户端看到或使用。当客户端退出时,该客户端连接的所有变量将自动释放。

  3) 用户变量的形式为@var_name,其中变量名var_name可以由当前字符集的文字数字字符、‘.’、‘_’和‘$’组成。 默认字符集是cp1252 (Latin1)。可以用mysqld的default-character-set选项更改字符集。

  4) 用户变量名对大小写不敏感。
  5) 设置用户变量的一个途径是执行SET语句:

SET @var_name = expr [, @var_name = expr] ...

    对于SET,可以使用=或:=作为分配符。分配给每个变量的expr可以为整数、实数、字符串或者NULL值。

    也可以用语句代替SET来为用户变量分配一个值。在这种情况下,分配符必须为:=而不能用=,因为在非SET语句中=被视为一个比较 操作符:

mysql> SET @t1=0, @t2=0, @t3=0;
mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;

+-------------------------------+------+------+------+

| @t1:=(@t2:=1)+@t3:=4  | @t1 | @t2  | @t3 |

+-------------------------------+------+------+------+

|          5                           |    5  |    1   |    4  |

+-------------------------------+------+------+------+

  6) 用户变量可以用于表达式中。目前不包括明显需要文字值的上下文中,例如SELECT语句的LIMIT子句,或者LOAD DATA语句的IGNORE number LINES子句。

  7) 如果使用没有初始化的变量,其值是NULL。

2. OUT 输出的例子

mysql > CREATE PROCEDURE p6 (OUT p INT)
         -> SET p = -5 //
mysql> CALL p6(@y) //
mysql> SELECT @y //  

  本例中,p是输出参数,调用过程将p的值传入会话变量@y中.

3. 复合语句

CREATE PROCEDURE p7 ()
BEGIN
    SET @a = 5;
    SET @b = 5;
    INSERT INTO t VALUES (@a);
    SELECT s1 * @a FROM t WHERE s1 >= @b;
END; //   /* 这个语句将不会被调用*/ 

  复合语句一般由BEGIN/END块包括.可以用块去封装多条语句,完成一些sql语句进行变量定义和流程控制等.

  

原文地址:https://www.cnblogs.com/free-coder/p/4774005.html