1.什么是存储过程
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升。
存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
2.存储过程格式
声明语句结束符,可以自定义:
DELIMITER(定界符) $$
或
DELIMITER //
声明存储过程:
CREATE PROCEDURE demo_in_parameter(IN p_in int)
CREATE PROCEDURE 存储过程名(输入符 参数名 参数类型)
存储过程开始和结束符号:
BEGIN ....
(内容)
END
变量赋值:
SET @p_in=1
变量定义:
DECLARE l_int int unsigned default 4000000;
实例
mysql> delimiter $$ #将语句的结束符号从分号;临时改为两个$$(可以是自定义)
mysql> CREATE PROCEDURE delete_matches(IN p_playerno INTEGER)
-> BEGIN
-> DELETE FROM MATCHES
-> WHERE playerno = p_playerno;
-> END$$
Query OK, 0 rows affected (0.01 sec)
mysql> delimiter; #将语句的结束符号恢复为分号
调用存储过程
call delete_matches(12);
call 函数名(参数);
3.存储过程参数
- IN 输入参数:表示调用者向存储过程传入值,存储过程中修改该参数的值不能被返回,为默认值
- OUT 输出参数:表示过程向调用者传出值,在存储过程中可被改变并返回
- INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值,可被改变返回
IN输入实例
DELIMITER //
CREATE PROCEDURE insert_data(IN a_name string,IN a_age int)
BEGIN
insert into aware(name,age) values (a_name ,a_age ) ;
END//
DELIMITER ;
OUT实例
DELIMITER //
CREATE PROCEDURE out_data(OUT a_name string,OUT a_age int)
BEGIN
select a_name,a_age ;
set a_name =1;
set a_age=2;
select a_name,a_age;
END//
DELIMITER ;
INOUT实例
mysql> delimiter $$
mysql> create procedure inout_data(inout a_name int)
-> begin
-> select a_name ;
-> set a_name =2;
-> select a_name ;
-> end
-> $$
mysql> delimiter ;
mysql> set @a_name =1;
mysql> call inout_data(@a_name);
+---------+
| a_name |
+---------+
| 1 |
+---------+
+---------+
| a_name |
+---------+
| 2 |
+---------+
mysql> select @a_name ;
+----------+
| @a_name |
+----------+
| 2 |
+----------+
#调用了inout_data存储过程,接受了输入的参数,也输出参数,改变了变量
4.变量
4.1定义
局部变量声明一定要放在存储过程体的开始:
DECLARE variable_name [,variable_name...] datatype [DEFAULT value];
DECLARE(声明) 变量名[,若干变量名...] 数据类型 [DEFAULT value(默认值)];
4.2赋值
SET @variables_name = 2
SET 变量名 = 表达式值
5.注释
MySQL 存储过程可使用两种风格的注释
两个横杆–:该风格一般用于单行注释。
/* */: 一般用于多行注释。
示例
create procedure sp1(in p int)
comment 'insert into a int value'
begin
/* 定义一个整形变量 */
declare v1 int;
/* 将输入参数的值赋给变量 */
set v1 = p;
/* 执行插入操作 */
insert into test(id) values(v1);
end
//
mysql > DELIMITER //
mysql > CREATE PROCEDURE proc1 --name存储过程名
-> (IN parameter1 INTEGER)
-> BEGIN
-> DECLARE variable1 CHAR(10);
-> IF parameter1 = 17 THEN
-> SET variable1 = 'birds';
-> ELSE
-> SET variable1 = 'beasts';
-> END IF;
-> INSERT INTO table1 VALUES (variable1);
-> END
-> //
mysql > DELIMITER ;
6.存储过程的修改
6.1 查看存储过程
show procedure status where db='数据库名';
或者
select routine_name from information_schema.routines where routine_schema='数据库名';
或者
select name from mysql.proc where db='数据库名';
数据库名可通过以下代码查看
select database();
或者
status;
6.2 修改存储过程
ALTER PROCEDURE
6.3 删除存储过程
DROP PROCEDURE
参考文章
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/64412.html