先给大家介绍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都被封装在了存储过程内部。