一、基本语法及简单实例
1、创建简单的测试环境
- mysql> use test;
- Database changed
- mysql> show tables;
- Empty set (0.00 sec)
-
- mysql> CREATE TABLE t(s1 INT);
- Query OK, 0 rows affected (0.06 sec)
-
- mysql> INSERT INTO t VALUES(5);
- Query OK, 1 row affected (0.02 sec)
2、选择分隔符
我们一般使用";"作为分隔符,但是在编写存储过程的时候这会带来一些问题,因为存储过程中有许多语句,修改会";"作为分隔符可使用语句"DELIMITER ;//"。
3、创建存储过程
- mysql> CREATE PROCEDURE p1() SELECT * FROM t;//
- Query OK, 0 rows affected (0.08 sec)
"CREATE PROCEDURE"即为SQL语句部分,第二部分是过程名"p1"(这里需要注意的是存储过程名对大小写不敏感)。
第三部分 () 是参数列表,通常需要在其中添加参数,这里参数为空,但是"()"必须存在。
"SELECT * FROM t;"是存储过程的主体,注意哦,";"是主体的一部分哦,创建该存储过程的语句的真正结束符为"//"。
另外需要注意的一点是,和我们创建表一样,在创建存储过程前面需要检查是否存在同名的存储过程,即" DROP PROCEDURE IF EXISTS p1;",没错这正是删除一个存储过程的SQL语句。另外,不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程。
4、调用存储过程
- mysql> CALL p1()//
- +
- | s1 |
- +
- | 5 |
- +
- 1 row in set (0.00 sec)
-
- Query OK, 0 rows affected (0.00 sec)
这里只是简单的调用,在下一点关于参数的使用办法中有更为复杂的调用。
5、参数(Parameter)
- mysql> CREATE PROCEDURE p2(p INT) SET @x = p ;//
- Query OK, 0 rows affected (0.02 sec)
-
- mysql> CALL p2(123)//
- Query OK, 0 rows affected (0.00 sec)
-
- mysql> SELECT @x//
- +
- | @x |
- +
- | 123 |
- +
- 1 row in set (0.01 sec)
这是输入参数的例子,我们选择了会话变量@x证明成功的将参数传入了改变量。
- mysql> CREATE PROCEDURE p3(OUT p INT)
- -> SET p = -5;//
- Query OK, 0 rows affected (0.00 sec)
-
- mysql> CALL p3(@y)//
- Query OK, 0 rows affected (0.01 sec)
-
- mysql> SELECT @y//
- +
- | @y |
- +
- | -5 |
- +
- 1 row in set (0.00 sec)
这是输出参数的例子,我们选择会话变量@y去接收存储过程p3输出参数的值。
6、变量(Variables)
- CREATE PROCEDURE P5()
- BEGIN
- DECLARE a INT;
- DECLARE b INT;
- SET a = 5;
- SET b = 5;
- INSERT INTO t VALUES(a);
- SELECT s1 FROM t WHERE s1>= b;
- END;
-
- mysql> CALL p5();
- +
- | s1 |
- +
- | 5 |
- | 5 |
- +
- 2 rows in set
-
- Query OK, 0 rows affected
在过程中定义的变量并不是真正的定义,你只是在BEGIN/END(即复合语句)块内定义了而已。注意这些变量和会话变量不一样,不能使用修饰符@你必须清楚的在BEGIN/END块中声明变量和它们的类型。变量一旦声明,你就能在任何能使用会话变量、文字、列名的地方使用。还需要注意的一点是,在一个块内,我们需要把所有要使用的变量先声明,才能在后面使用,并且不能在声明变量的语句间夹杂其他使用变量的语句,否会报语法错误。
- CREATE PROCEDURE P6()
- BEGIN
- DECLARE a,b INT DEFAULT 5;
- INSERT INTO t VALUES(a);
- SELECT s1 * a FROM t WHERE s1>= b;
- END;
-
- mysql> CALL p6();
- +
- | s1 * a |
- +
- | 25 |
- | 25 |
- | 25 |
- +
这里使用DEFAULT子句来设定初始值,如此我们可以不需要把DECLARE和SET语句的实现分开。
7、区块的定义使用
一般形式为
也可以给区块起别名,如:
- lable:begin
- ...........
- end lable;
可以用leave lable;跳出区块,执行区块以后的代码。
8、条件语句
一般形式为
- if 条件 then
- statement
- else
- statement
- end if;
实例:
- CREATE PROCEDURE p7(IN param1 INT)
- BEGIN
- DECLARE v1 INT;
- SET v1 = param1 + 1;
- IF v1 = 0 THEN
- INSERT INTO t VALUES(17);
- END IF;
- IF param1 = 0 THEN
- UPDATE t SET s1 = s1 + 1;
- ELSE
- UPDATE t SET s1 = s1 + 2;
- END IF;
- END;//
-
- mysql> SELECT * FROM t;
- +
- | s1 |
- +
- | 6 |
- | 6 |
- | 6 |
- +
- 3 rows in set
-
- mysql> CALL p7(0);
- Query OK, 3 rows affected
-
- mysql> CALL p7(0);
- Query OK, 3 rows affected
-
- mysql> SELECT * FROM t;
- +
- | s1 |
- +
- | 8 |
- | 8 |
- | 8 |
- +
- 3 rows in set
过程很简单,可以看出调用两次即执行了两次UPDATE t SET s1= s1 + 1;语句。另外还有CASE指令,使用办法和IF一样简单,简单实例如下:
- CREATE PROCEDURE p8(IN param1 INT)
- BEGIN
- DECLARE v1 INT;
- SET v1 = param1 + 1;
- CASE v1
- WHEN 0 THEN INSERT INTO tVALUES(17);
- WHEN 1 THEN INSERT INTO tVALUES(18);
- ELSE INSERT INTO tVALUES(19);
- END CASE;
- END;//
9、循环语句
1)while循环
- [label:] WHILE expression DO
- statements
- END WHILE [label] ;
实例:
- CREATE PROCEDURE p9 ()
- BEGIN
- DECLARE v INT;
- SET v = 0;
- WHILE v < 5 DO
- INSERT INTO t VALUES(v);
- SET v = v + 1;
- END WHILE;
- END; //
2)repeat until循环
- [label:] REPEAT
- statements
- UNTIL expression
- END REPEAT [label] ;
实例:
- CREATE PROCEDURE p10 ()
- BEGIN
- DECLARE v INT;
- SET v = 0;
- REPEAT
- INSERT INTO t VALUES(v);
- SET v = v + 1;
- UNTIL v >= 5
- END REPEAT;
- END; //
3)loop循环
- [label:] LOOP
- statements
- END LOOP[label];
实例:
- CREATE PROCEDUREp11 ()
- BEGIN
- DECLARE v INT;
- SET v = 0;
- loop_label: LOOP
- INSERT INTO t VALUES (v);
- SET v = v + 1;
- IF v >= 5 THEN
- LEAVE loop_label;
- END IF;
- END LOOP;
- END; //
10、其他常用命令
1)showprocedure status
显示数据库中所有存储的存储过程基本信息,包括所属数据库,存储过程名称,创建时间等
2)show createprocedure sp_name
显示某一个存储过程的详细信息
原文出处:
MySQL存储过程学习笔记