刚开始学习MySQL时,对MySQL存储过程和函数的操作总是搞混,于是就总结了一下,希望对初学MySQL的小伙伴们有一点帮助。
不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程。
创建存储过程和函数
创建存储过程
CREATEPROCEDURE sp_name ([proc_parameter[,...]])
[characteristic...] routine_body
proc_parameter:IN|OUT|INOUTparam_name type
characteristic:
LANGUAGE SQL 默认,routine_boyd由 SQL 组成
[NOT]DETERMINISTIC 指明存储过程的执行结果是否是确定的,默认不确定
CONSTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA 指定程序使用 SQL 语句的限制
CONSTAINS SQL 子程序包含 SQL,但不包含读写数据的语句,默认
NO SQL 子程序中不包含 SQL 语句
READS SQL DATA 子程序中包含读数据的语句
MODIFIES SQLDATA 子程序中包含了写数据的语句
SQL SECURITY{DEFINER|INVOKER},指明谁有权限执行。
DEFINER,叧有定义者自己才能够执行,默认
INVOKER 表示调用者可以执行
COMMENT ‘string’ 注释信息
创建存储函数
CREATE FUNCTION sp_name ([func_parameter[,...]])
RETURNS type
[characteristic ...] routine_body
变量的使用
DECLAREvar_name[,…] type [DEFAULT value]
查看存储过程和函数
SHOW { PROCEDURE | FUNCTION } STATUS [ LIKE' pattern ' ] ;
SHOW CREATE { PROCEDURE | FUNCTION }sp_name ;
SELECT * FROM information_schema.RoutinesWHERE ROUTINE_NAME=' sp_name ' ;
sp_name:存数过程名或存储函数名
游标
WHILE
LOOP
DELIMITER $$
DROP PROCEDURE IF EXITS cursor_example$$
CREATE PROCEDURE cursor_example()
READS SQL DATA
BEGIN
DECLARE l_employee_id INT;
DECLARE l_salary NUMERIC(8,2);
DECLARE l_department_id INT;
DECLARE done INT DEFAULT 0;
DECLARE cur1 CURSOR FOR SELECT employee_id, salary, department_id FROM employees;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
OPEN cur1;
emp_loop: LOOP
FETCH cur1 INTO l_employee_id, l_salary, l_department_id;
IF done=1 THEN
LEAVE emp_loop;
END IF;
END LOOP emp_loop;
CLOSE cur1;
END$$
DELIMITER ;
REPEAT
/*创建过程*/
DELIMITER //
DROP PROCEDURE IF EXISTS test //
CREATE PROCEDURE test()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE a VARCHAR(200) DEFAULT '';
DECLARE c VARCHAR(200) DEFAULT '';
DECLARE mycursor CURSOR FOR SELECT fusername FROM uchome_friend;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
OPEN mycursor;
REPEAT
FETCH mycursor INTO a;
IF NOT done THEN
SET c=CONCAT(c,a);/*字符串相加*/
END IF;
UNTIL done END REPEAT;
CLOSE mycursor;
SELECT c;
END //
DELIMITER ;