Mysql存储过程

先给大家介绍Myql中两个两个全局变量:

>SHOW PROCESSLIST;  #显示调用当前数据库的进程

>SHOW VARIABLES ;   #显示当前数据库中各全局变量的设置

 存储过程

>显示MYSQL中的所有的存储过程(所有的数据库中):

show procedure status;

效果等同于:select * from mysql.proc;

若要查询当前Mysql下面某个库中含有的所有存储过程:

select * from mysql.proc where db="数据库名";

>显示某个存储过程创建的详细代码:

show create procedure sp_works ;

结果如下:

DROP PROCEDURE IF EXISTS sp_works;
DELIMITER //

CREATE PROCEDURE `sp_works`(
IN name_in varchar(30),
OUT id_out int,
OUT name_out varchar(30),
OUT theme_out varchar(200)
)
begin
IF name_in IS NULL OR name_in = '' then
SELECT '输入条件为空不返回任何记录' INTO name_out;
ELSE
select id,renrenName,theme into id_out,name_out,theme_out from works_00 where renrenName like name_in LIMIT 1;
END IF;
END //

DELIMITER ;

调入存储过程如下:

call sp_works('%鹏%',@id_out,@name_out,@themel_out);

第一个是传人参数,第二个、三个、四个是传出参数

select @id_out, @name_out ;

 Mysql中DELIMITER是分隔符,也就是一条sql语句的结束符号,Mysql的默认分隔符是";",在存储过程、函数、触发器、游标等代码中,因为可能包含很多";"这样的分隔符,所以一个存储过程没有执行完遇到";"就会报错,所以要把分隔符修改一下,一般修改为"//",当执行完后再把Mysql的分隔符还原为";"。

DROP PROCEDURE IF EXISTS sp_works; 意思是若存在此存储过程就删除。

存储过程demo2:

drop procedure  if exists  sp_binary_table;
delimiter //
create procedure sp_binary_table
(
in  param1_in varchar(30),
out param2_out varchar(30),
out   param3_out  varchar(40)
)
begin
select file_name,file_type into param2_out,param3_out from binary_table where file_type like param1_in limit 1;
end;
//
delimiter ;

执行此存储过程:

call sp_binary_table('image/jpeg',@file_name,@file_type);

select @file_name,@file_type;

注意:

mysql的参数赋值语句必须是只能够选出一行

SELECT username,nickname INTO Ausername,Anickname FROM userbase WHERE userid = userid LIMIT 1 ;

这样的语句必须要加上limit 1才行。

另外,这种赋值语句还有个规矩就是参数名和字段名不能冲突,不然能够执行过去,但是却没有给参数赋值,这是个很隐性的错误,可以参考手册上的

重要: SQL变量名不能和列名一样。如果SELECT ... INTO这样的SQL语句包含一个对列的参考,并包含一个与列相同名字的局部变量,MySQL当前把参考解释为一个变量的名字。例如,在下面的语句中,xname 被解释为到xname variable 的参考而不是到xname column

 Mysql存储过程只能返回单条记录,因为它没有自定义类型,这限制了Mysql中存储过程的功能,这是mysql的缺憾。

存储过程的优点:

>提高SQL性能:因为节省了sql语句编译和运行的过程,并节省了有些传递大量sql语句到数据库中

>提高安全行:隐藏了表的名称和结构,并且能设置访问权限

>简化sql语句:复杂的sql都被封装在了存储过程内部。

原文地址:https://www.cnblogs.com/andydao/p/2956458.html