变量,存储过程

变量

系统变量(全局变量,会话变量),自定义变量(用户变量,局部变量)

初始化&赋值&查看

查看所有系统全局变量

show global variables;

查看所有系统会话变量

show session variables;

设置&查看系统变量

set @@session.autocommit=1
select @@session.autocommit

设置&查看自定义变量

set @myvar = 1;
select @myvar;

将mytable的记录数赋值给$count

select count(*) into $count from mytable;

声明局部变量并赋值

ps:声明必须为begin end块的第一句,必须定义类型

begin
declare a int default 1;
declare b int default 2;
declare sum int;
set sum=a+b;
select sum;
end

存储过程

基础语法

delimiter 结束标记
create procedure myname(myparams)
begin
    存储过程体
end 结束标记

ps:

参数包含三部分

参数模式,参数名,参数类型
例子:IN name varchare(20)
参数模式:
IN:该参数可以作为输入,需要调用方传入值
OUT:该参数可以作为输出,该参数可以作为返回值
INOUT:该参数既可以作为输入又可以作为输出

如果存储过程体只有一句话,begin end可以省略

存储过程体中的每条sql语句结尾必须加分号。
delimiter重新设置存储过程的结尾,类比双引号,单引号,delimiter默认为;,但如果有很多;想一起执行,那还是换一个结束符号来处理,语法更清晰
语法:
delimiter 结束标记

调用语法

call funcname(params);

例子:

1. 空参存储过程

命令行下运行

delimiter $
create procedure myp1()
begin
  insert into table1(name)values('a1'),('a2'),('a3'),('a4'),('a5');
end $

调用

call myp1()$

查看

select * from table1 $

2.带IN和OUT参数的存储过程

MariaDB [test]> select * from table1 where name='a5';$
+----+------+-----------+------+
| id | name | addr      | age  |
+----+------+-----------+------+
|  9 | a5   | 劳动节    |   22 |
+----+------+-----------+------+
1 row in set (0.001 sec)

MariaDB [test]> create PROCEDURE myp2(IN uname VARCHAR(20),OUT addr VARCHAR(20),OUT age int)
    -> BEGIN
    -> SELECT table1.addr,table1.age into addr,age
    -> from table1 where table1.name=uname;
    -> end $
Query OK, 0 rows affected (0.010 sec)

MariaDB [test]> call myp2("a5",@addr,@age)$
Query OK, 1 row affected (0.001 sec)

MariaDB [test]> select @addr,@age $
+-----------+------+
| @addr     | @age |
+-----------+------+
| 劳动节    |   22 |
+-----------+------+
1 row in set (0.000 sec)

3.带INOUT参数的存储过程

MariaDB [test]> create PROCEDURE myp3(INOUT a int)
    -> BEGIN
    -> set a=a*2;
    -> end $
Query OK, 0 rows affected (0.020 sec)

MariaDB [test]> set @test=10$
Query OK, 0 rows affected (0.000 sec)

MariaDB [test]> call myp3(@test)$
Query OK, 0 rows affected (0.001 sec)

MariaDB [test]> select @test;
    -> $
+-------+
| @test |
+-------+
|    20 |
+-------+
1 row in set (0.001 sec)

删除存储过程

一次只能删一个
drop procedure proname;

查看存储过程的信息

show create procedure proname;