mysql存储过程


一.存储过程基本语法

  

1、创建存储过程

MySQL中,创建存储过程的基本形式如下:

CREATE PROCEDURE  存储过程名 (参数列表)
BEGIN
    SQL语句代码块
END
 

其中参数列表的形式如下:

[IN|OUT|INOUT] param_name type

多个参数之间用逗号“,”隔开,其中in表示输入参数,out表示输出参数,inout表示既可以输入也可以输出;param_name表示参数名称;type表示参数的类型,该类型可以是MYSQL数据库中的任意类型。

例子:下面的语句创建一个查询tb_user表全部数据的存储过程

复制代码
DROP PROCEDURE IF EXISTS sp_test;

DELIMITER //
CREATE PROCEDURE sp_test()
BEGIN
    SELECT * FROM tb_user;
END //
DELIMITER ;
复制代码

注意:

(1)由括号包围的参数列必须总是存在。如果没有参数,也该使用一个空参数列()。每个参数默认都是一个IN参数。要指定为其它参数,可在参数名之前使用关键词 OUT或INOUT

(2)"DELIMITER //" 语句的作用是将MYSQL的结束符设置为//,因为MYSQL默认的语句结束符为分号; ,存储过程中的SQL语句需要分号来结束,为了避免与存储过程中SQL语句结束符相冲突,需要使用DELIMITER 改变存储过程的结束符,并以"END //"结束存储过程。存储过程定义完毕之后再使用DELIMITER ;恢复默认结束符。DELIMITER 也可以指定其他符号为结束符。注意:当使用DELIMITER命令时,应该避免使用反斜杠(\)字符,因为反斜杠是MYSQL的转义字符!!!

     DELIMITER 是分割符的意思,其实就是定义了一个语句执行的结束符,类似函数or存储过程这样的create语句由于其中包含了很多的";",而默认MySQL的结束符就是";",那么当我们创建的时候就会报错,有了DELIMITER 就可以告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了。 

默认情况下,delimiter是分号";"。在命令行客户端中,如果有一行命令以分号结束, 那么回车后,mysql将会执行该命令。如输入下面的语句 
mysql> select * from stu; 

然后回车,那么MySQL将立即执行该语句。但有时候,不希望MySQL这么做。因为可能输入较多的语句,且语句中包含有分号。 默认情况下,不可能等到用户把这些语句全部输入完之后,再执行整段语句。因为mysql一遇到分号,它就要自动执行。 即,在语句之后为";"时,mysql解释器就要执行了。 这种情况下,就需要事先把delimiter换成其它符号,如//或$$等其他符号。 这样只有当$$出现之后,mysql解释器才会执行这段语句 。记得最后一个要将结束符修改回";"。

2、删除存储过程
语法:
DROP PROCEDURE  IF  EXISTS  存储过程名;

eg:

DROP PROCEDURE IF EXISTS proc_employee;

这个语句被用来移除一个存储程序。不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程。

3、调用存储过程

语法:

CALL 存储过程名(参数列表);

注:
(1)CALL语句是用来调用一个先前用CREATE PROCEDURE创建的存储过程。
(2)CALL语句可以用声明为OUT或INOUT参数的参数给它的调用者传回值。
(3)存储过程名称后面必须加括号,哪怕该存储过程没有参数传递。

 
二.个人测试
 
1.创建测试数据库db1
 
  create database db1;
 
2.创建测试表employee_tbl
  

CREATE TABLE `employee_tbl` (
`id` int(11) NOT NULL,
`NAME` varchar(255) DEFAULT NULL,
`date` datetime NOT NULL,
`signin` tinyint(4) NOT NULL DEFAULT '0' COMMENT '登录次数',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

 

3.插入测试数据:

  

 

 4.编写并编译存储过程,根据id查询对应的signin:

DELIMITER //
CREATE PROCEDURE myproc(
in o_id int,
out o_signin int
)
BEGIN
select signin into o_signin from employee_tbl where id = o_id;
END //
DELIMITER ;

 

5.定义变量o_id,o_signin:

  set @o_id = 1;

  set @o_signin= 1;

 

6.调用存储过程:

  call myproc(@o_id,@o_total);

 

7.查询执行结果:

  select @o_signin;

 

存储过程入参也可以不用传递变量,可以直接传递字面值,比如call myproc(1,@o_total);也是可以的,同时在存储过程外部用@定义的变量为用户变量,在整个会话都有效,会话断开失效;也可以在存储过程中定义局部变量,局部变量请看下文

 

 

三.定义存储过程局部变量

在存储过程和函数中,可以定义和使用变量。用户可以使用DECLARE关键字来定义变量。然后可以为变量赋值。这些变量的作用范围是BEGIN…END程序段中。

MySQL中可以使用DECLARE关键字来定义变量。定义变量的基本语法如下:

DECLARE  var_name[,...]  type  [DEFAULT value] 

其中, DECLARE关键字是用来声明变量的;var_name参数是变量的名称,这里可以同时定义多个变量;type参数用来指定变量的类型;DEFAULT value子句将变量默认值设置为value,没有使用DEFAULT子句时,默认值为NULL。

【示例】 下面定义变量my_sql,数据类型为INT型,默认值为10。代码如下:

DECLARE  my_sql  INT  DEFAULT 10 ; 
使用说明:
局部变量只能在存储过程体的begin…end语句块中声明。
局部变量必须在存储过程体的开头处声明。
局部变量的作用范围仅限于声明它的begin..end语句块,其他语句块中的语句不可以使用它。
局部变量不同于用户变量,两者区别:局部变量声明时,在其前面没有使用@符号,并且它只能在begin..end语句块中使用;而用户变量在声明时,会在其名称前面使用@符号,同时已声明的用户变量存在于整个会话之中。

(2)为变量赋值

MySQL中可以使用SET关键字来为变量赋值。SET语句的基本语法如下:

SET  var_name = expr [, var_name = expr] ... 

其中,SET关键字是用来为变量赋值的;var_name参数是变量的名称;expr参数是赋值表达式。一个SET语句可以同时为多个变量赋值,各个变量的赋值语句之间用逗号隔开。

【示例】下面为变量my_sql赋值为30。代码如下:

SET  my_sql = 30 ; 

MySQL中还可以使用SELECT…INTO语句为变量赋值。其基本语法如下:

SELECT  col_name[,…]  INTO  var_name[,…]  FROM  table_name  WEHRE  condition 

其中,col_name参数表示查询的字段名称;var_name参数是变量的名称;table_name参数指表的名称;condition参数指查询条件。

【示例】 下面从employee表中查询id为2的记录,将该记录的d_id值赋给变量my_sql。代码如下:

SELECT  d_id  INTO  my_sql  FROM  employee  WEHRE  id=2 ; 

 

 
 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM