欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

MySQL5的存储过程详细实例

程序员文章站 2022-05-26 18:55:46
...

本文章来介绍一下关于mysql5的新特性存储过程了,在mysql5之前是没有存储过程这一说的,下面我们来看看mysql5存储过程的用法。

MySQL 5.0
新特性教程是为需要了解5.0版本新特性的MySQL老用户而写的。简单的来说是介绍了“存储过程、触发器、视图、信息架构视图
格式:

CREATE PROCEDURE 过程名 ([过程参数[,...]])
[特性 ...] 过程体

CREATE FUNCTION 函数名 ([函数参数[,...]])
RETURNS 返回类型
[特性 ...] 函数体

过程参数:
[ IN | OUT | INOUT ] 参数名 参数类型

函数参数:
参数名 参数类型

返回类型:
有效的MySQL数据类型即可

特性:
LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'

过程体/函数体:格式如下:
BEGIN
有效的SQL语句
END

实例

DELIMITER $$
DROP PROCEDURE IF EXISTS `spTest` $$
CREATE PROCEDURE `spTest`(p_title VARCHAR(200), p_description TEXT)
DETERMINISTIC
BEGIN
INSERT INTO category (title, description)
VALUES (p_title, p_description);
END $$
DELIMITER ;
其中DELIMITER是用来决定SQL分隔符号的,在写Stored Procedure前,要先把预设的分号换掉,写完 Stored Procedure 的 routine_body 后,再回复成预设的分号。

--删除
drop procedure if exists up_common_select

--创建

CREATE PROCEDURE `up_common_select`(
in t_name varchar(50)
)
begin
declare v_sql varchar(500);
set v_sql= concat('select * from ',t_name);
select v_sql;
--
--注意:prepare(预处理)execute stmt using @var,只能跟@,declare和传入的变量不行!!!
set @v_sql=v_sql;

prepare stmt from @v_sql;
EXECUTE stmt ;
deallocate prepare stmt;

end;

--调用

call up_common_select('admin_authority');
#############################################
#注意事项
###########
1 mysql5.0.13之后支持在存储过程中调用prepare
2, prepare stmt from 'select * from ?'; (错)
mysql5.0.24,prepare尚不支持 表名做变量!
解决方案:用 contat()函数,组合字符串
3. execute stmt [using @var,@var2]
必须是@var形式的变量,传入的参数变量,declare变量不行
4. deallocate prepare stmt; 显式的释放prepare,如果不释放,mysql会释放,!

相关标签: mysql存储过程