300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > MySQL存储过程学习笔记

MySQL存储过程学习笔记

时间:2022-06-10 20:29:56

相关推荐

MySQL存储过程学习笔记

数据库|mysql教程

MySQL,存储,过程,学习,笔记,基本,语法,简单,实例,

数据库-mysql教程

第四方支付 源码,ubuntu网卡查看命令,服务器上新建tomcat,爬虫抓取播放链接,php是哪一年,附子seo论坛lzw

A、基本语法及简单实例 1、创建简单的测试环境 [sql] view plaincopy mysqlusetest; Database changed mysqlshowtables; Empty set (0.00sec) mysql CREATE TABLE t(s1 INT ); QueryOK,0 rows affected(0.06sec) mysql INSERT INTO t VALUES (5); QueryOK,1

彩票源码软件,UBUNTU安装窗户设计,tomcat设置jsp兼容性,爬虫探测视频,php检查手机号,seo检验教程lzw

仿一流素材网源码,用vscode画表,浙江ubuntu,tomcat输入8080,sqlite3 显示表,wordpress图片防盗链插件,说出一种前端框架,python爬虫存文件到过程,jquery获取php,怎么取消seo查询,网站小工具源码,html网页拖动特效,淘宝淘宝客ppt模板下载地址lzw

A、基本语法及简单实例

1、创建简单的测试环境

[sql] view

plaincopy

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

[sql] view

plaincopy

mysql> DELIMITER //

我们一般使用”;”作为分隔符,但是在编写存储过程的时候这会带来一些问题,因为存储过程中有许多语句,修改会”;”作为分隔符可使用语句”DELIMITER ;//”。

3、创建存储过程

[sql] view

plaincopy

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、调用存储过程

[sql] view

plaincopy

mysql> CALL p1()//

+——+

| s1 |

+——+

| 5 |

+——+

1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

这里只是简单的调用,在下一点关于参数的使用办法中有更为复杂的调用。

5、参数(Parameter)

[sql] view

plaincopy

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证明成功的将参数传入了改变量。

[sql] view

plaincopy

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)

[sql] view

plaincopy

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块中声明变量和它们的类型。变量一旦声明,你就能在任何能使用会话变量、文字、列名的地方使用。还需要注意的一点是,在一个块内,我们需要把所有要使用的变量先声明,才能在后面使用,并且不能在声明变量的语句间夹杂其他使用变量的语句,否会报语法错误。

[sql] view

plaincopy

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、区块的定义使用

一般形式为

[sql] view

plaincopy

begin

……

end;

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

[sql] view

plaincopy

lable:begin

………..

end lable;

可以用leave lable;跳出区块,执行区块以后的代码。

8、条件语句

一般形式为

[sql] view

plaincopy

if 条件 then

statement

else

statement

end if;

实例:

[sql] view

plaincopy

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一样简单,简单实例如下:

[sql] view

plaincopy

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循环

[sql] view

plaincopy

[label:] WHILE expression DO

statements

END WHILE [label] ;

实例:

[sql] view

plaincopy

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循环

[sql] view

plaincopy

[label:] REPEAT

statements

UNTIL expression

END REPEAT [label] ;

实例:

[sql] view

plaincopy

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循环

[sql] view

plaincopy

[label:] LOOP

statements

END LOOP[label];

实例:

[sql] view

plaincopy

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

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

B、常见错误及处理办法

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语法错误,仔细检查错误提示信息所指语句附近改正即可。

例:

[sql] view

plaincopy

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的存储过程传入的参数个数不对。

例:

[sql] view

plaincopy

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存储过程学习总结》–平凡的世界/100.html

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

/horace20 ^_^

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。