`
horace20
  • 浏览: 17510 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

MySQL存储过程学习笔记

阅读更多

一、基本语法及简单实例

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、选择分隔符

mysql> DELIMITER //

我们一般使用";"作为分隔符,但是在编写存储过程的时候这会带来一些问题,因为存储过程中有许多语句,修改会";"作为分隔符可使用语句"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、区块的定义使用

一般形式为

begin
......
end;

也可以给区块起别名,如:

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

显示某一个存储过程的详细信息

二、常见错误及处理办法

1、[Err] 1064 -You have an error in your SQL syntax; check the manual that corresponds to yourMySQL server version for the right syntax to use near '***'

很简单,1064即为SQL语法错误,仔细检查错误提示信息所指语句附近改正即可。

例:

CREATE PROCEDURE P12()
BEGIN
 DECLARE a INT;
 SET a = 5;
 DECLARE b INT;
 SET b = 5;
 INSERT INTO t VALUES(a);
 SELECT s1 FROM t WHERE s1>= b;
END;

提示信息为:

[Err] 1064 - You have an error in your SQL syntax; check the manualthat corresponds to your MySQL server version for the right syntax to use near'DECLARE b INT;

SET b = 5;

INSERT INTO t VALUES(a);

SELECT s1 FROM t WHE' at line 5

提示在第5行,我们发现在变量声明语句"DECLARE b INT;"的前面有一条赋值语句"SET a = 5;",只需将其放到所有变量声明语句之后即可。

2、[Err] 1318 -Incorrect number of arguments for PROCEDURE *.*; expected *, got *

如提示信息,database_name.procedure_name的存储过程传入的参数个数不对。

例:

CREATE PROCEDURE p13(OUT p INT)
SET p = -5;
CALL p13();

提示信息为:

[Err] 1318 - Incorrect number of arguments for PROCEDURE test.p13;expected 1, got 0

改为CALL p13(@a); 即可。

3、[Err] 1414 -OUT or INOUT argument 1 for routine *.* is not a variable or NEWpseudo-variable in BEFORE trigger

此信息也是提示我们传入的参数不对,*.*的存储过程参数为输出(或输入)参数,而我们可能传入相反的参数,例如要求为输出参数,而我们传入的参数非会话变量,即会报此错。

例:

CALL p13(a); -- 或者CALL p13(0);

提示信息:

[Err] 1414 - OUT or INOUT argument 1 for routine test.p13 is not avariable or NEW pseudo-variable in BEFORE trigger

改正:

CALL p13(@a);

SELECT @a;

参考资料:

1、《mysql 5.0存储过程学习总结》--平凡的世界http://www.ccvita.com/100.html

2、《MYSQL 5.0存储过程》--Peter Gulutzan 著 陈朋奕 译

特别申明:学习总结,亦并非什么优秀学习资料,但转载请注明原文出处:http://blog.csdn.net/horace20^_^

分享到:
评论

相关推荐

    MySQL视图及存储过程学习笔记

    MySQL视图及存储过程学习笔记

    Mysql存储过程学习笔记–建立简单的存储过程

    一、存储过程  存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户 通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。而...

    Mysql存储过程学习笔记--建立简单的存储过程

    我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该...

    MySQL5学习笔记

    MySQL存储过程之java调用 9 MySQL存储过程实现动态查询 12 MySQL应用总结 12 MySQL数据管理 15 数据管理 15 MySQL数据导出 15 MySQL数据还原 15 MySQL灾难性复制恢复总结 16 MySQL授权管理 17 未解决及已解决问题 19...

    非常详细的某培训机构mysql学习笔记

    非常详细的某培训机构mysql学习笔记,内容系统全面,实用性强 MySQL1 MySQL基础 MySQ单实例部署 MySQL多实例部署 MySQL数据库操作 MySQL数据类型 MySQL存储引擎 MySQL表操作 MySQL2 MySQL数据操作 MySQL单...

    MySQL核心技术学习笔记

    MySQL核心技术学习笔记,包括从MySQL产品的安装到DQL语言的学习、DML语言的学习、DDL语言的学习、TCL语言的学习、视图、存储过程等,以及相关案例实现语句等等。

    MySQL学习笔记(含基础、运维、进阶三部分)

    MySQL学习笔记(含基础、运维、进阶三部分) MySQL学习笔记(含基础、运维、进阶三部分) MySQL学习笔记(含基础、运维、进阶三部分) 包含了我学习 MySQL 过程中的笔记和资源,从入门到进阶的内容都有涉及。通过...

    mysql学习笔记和案例(完全版)

    这是我自己学习mysql时的学习笔记,每一个知识点都是自己动手写的,涵盖了mysql中的几乎全部的基础知识点,查询,子查询,分组,排序,常用函数,多表连接,视图,约束,分页,建库建表,数据类型,标识列,级联删除...

    mysql学习笔记和案例(全部知识点版)

    这是我自己学习mysql时的学习笔记,每一个知识点都是自己动手写的,涵盖了mysql中的几乎全部的基础知识点,查询,子查询,分组,排序,常用函数,多表连接,视图,变量,存储过程,函数,分支结构,循环结构等等

    MySQL5.5学习笔记

    MySQL5.5学习笔记,里边是MySQL基础知识,包括对数据库,数据表,视图,数据类型和运算符,MySQL函数,存储过程和函数,以及对数据的增删改查等知识,还有MySQL用户管理以及数据备份与还原的知识!适合初学者学习~

    MySQL学习笔记2-高级查询与存储.md

    然后重点讲解了MySQL存储过程的创建、调用、参数、条件和循环语句等知识,同时提供了详细的代码示例进行解释说明,内容系统全面。 适合人群: 需要掌握MySQL高级应用的数据库学习者。文中具体的代码示例可助力开发。 ...

    MySQL学习笔记-基础到进阶

    内容概要:MySQL学习笔记,内容包括SQL基本语法、MySQL基础知识,包括存储引擎、索引、视图、锁、优化、存储结构等MySQL主要的内容。 适用人群:适合自学MySQL的同学使用。 能学到什么:MySQL从基础到进阶的全部内容...

    mysql学习笔记和案例(完全版)2019_10_17.zip

    这是我自己学习mysql时的学习笔记,每一个知识点都是自己动手写的,涵盖了mysql中的几乎全部的基础知 识点,查询,子查询,分组,排序,常用函数,多表连接,视图,约束,分页,建库建表,数据类型, 标识列,级联...

    mysql学习笔记和案例(完全版)2019_10_21.zip

    这是我自己学习mysql时的学习笔记,每一个知识点都是自己动手写的,涵盖了mysql中的几乎全部的基础知 识点,查询,子查询,分组,排序,常用函数,多表连接,视图,约束,分页,建库建表,数据类型, 标识列,级联...

    MySQL5.7学习笔记 完整版PDF

    《MySQL5.7学习笔记》将从MySQL5.7的安装、配置、使用等方面进行详细介绍,帮助读者快速掌握MySQL5.7的使用技巧。首先,我们将介绍MySQL5.7的安装方法,包括Windows和Linux平台的安装步骤。然后,我们将讲解MySQL5.7...

    MySQL学习笔记MySQL学习笔记

    数据的重要性也就在一定程度上影射了数据库的重要性,因为数据领域的最重要的安全问题、存储问题、关系问题等,很多方面的整合都需要依靠数据库来完成。 举个例子,现在有很多数据分析师,他们每天最基本的工作往往...

    mysql学习笔记和案例(完全版)2019_10_16.zip

    这是我学习mysql数据库的时候做的学习笔记,增删查改,视图,自定义函数,自定义存储过程,触发器,索引,sql编程等等。

    mysql 学习笔记 绝对原创 包含工作中常用的语句 存储过程 函数 触发器等

    个人原创,根据自己的工作总结的,对工作的人事来说帮助很大。。里面包含 mysql的基本知识 还有优化 部分 存储过程 等 里面的语句都完全正确,全部在数据库中验证过

    MySQL学习笔记,包括SQL基本语法、MySQL基础知识,包括存储引擎、索引、视图、锁、优化、存储结构等MySQL主要的内容

    MySQL学习笔记,包括SQL基本语法、MySQL基础知识,包括存储引擎、索引、视图、锁、优化、存储结构等MySQL主要的内容。

    MySQL笔记整理.doc

    数据库,简而言之可视为电子化的文件柜——存储电子文件...这里有我整理的一些关于数据库的笔记(MySQL),其中包括了DDL、DML、DQL、DCL等知识,内容相对基础,适合小白用于复习使用,或者参照数据库视频教学等学习。

Global site tag (gtag.js) - Google Analytics