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)[email protected]:=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语句进行变量定义和流程控制等.