那些年的记忆

习惯改变行为,行为决定命运。

复习(八) MySQL存储过程

存储过程是SQL语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理。

优点:

    增强SQL语句的功能和灵活性

    实现较快的执行速度

    减少网络流量

创建存储过程

CREATE

[DEFINER = {user | CURRENT_USER}]

PROCEDURE sp_name ([proc_parameter[,...]])

[characteristic ...] routine_body


proc_parameter:

[IN | OUT | INOUT] param_name type


IN 表示该参数的值必须在调用存储过程时指定

OUT 表示该参数的值可以被存储过程改变,并且可以返回

INOUT 表示该参数的调用时指定,并且可以被改变和返回


过程体

由合法的SQL语句构成

可以是任意SQL语句

如果为复合结构则使用BEGIN...END语句

复合结构可以包含声明,循环,控制结构


调用存储过程

CALL sp_name([parameter[,...]])

CALL sp_name[()]


例如:

mysql> CREATE PROCEDURE sp1() SELECT VERSION();
mysql> CALL sp1();


创建带IN类型参数的存储过程

mysql> DELIMITER //
mysql> CREATE PROCEDURE removeUserById(IN p_id INT UNSIGNED)
    -> BEGIN
    -> DELETE FROM users WHERE id = p_id;
    -> END
    -> //
mysql> DELIMITER ;
mysql> CALL removeUserById(4);


删除存储过程

DROP PROCEDURE [IF EXISTS] sp_name

例如:

mysql> DELETE PROCEDURE removeUserById


创建带有IN和OUT类型参数的存储过程

mysql> DELIMITER //
mysql> CREATE PROCEDURE removeUserAndReturnUserNums(IN p_id INT UNSIGNED, OUT userNums INT UNSIGNED)
    -> BEGIN
    -> DELETE FROM users WHERE id = p_id;
    -> SELECT count(id) FROM users;
    -> END
    -> //
mysql> DELIMITER ;
mysql> CALL removeUserAndReturnUserNums(26, @nums);
mysql> SELECT @nums;


存储过程与自定义函数的区别

存储过程实现的功能要复杂一些;而函数的针对性更强

存储过程可以返回多个值;函数只能有一个返回值

存储过程一般独立来执行;而函数可以做为其他SQL语句的组成部分来出现


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。