MySQL 5.1版支持存储程序和函数。一个存储程序是可以被存储在服务器中的一套SQL语句。一旦它被存储了,客户端不需要再重新发布单独的语句,而是可以引用存储程序来替代。
用户创建子存储程序和函数,必须具有CREATE ROUTINE权限,并且ALTER ROUTINE和EXECUTE权限被自动授予它的创建者。
CREATE PROCEDURE <存储程序名称>
( {IN | OUT | INOUT} <参数> <类型>,...)
[<特性> ...]
<存储程序内容>
在编写存储程序前,用delimiter命令把语句定界符从;变为//。这就允许用在程序体中的;定界符被传递到服务器而不是被MySQL客户端自己来解释。
一段存储程序代码:
drop procedure if exists simpleproc;
delimiter //
CREATE PROCEDURE sum_students (OUT total INT)
BEGIN
SELECT COUNT(*) INTO total FROM Students;
END
//
delimiter ;
调用存储程序:
CALL sum_students(@a);
SELECT @a;
函数的定义与存储程序类似,区别是函数参数总是被认为是IN参数,并且函数强制要求RETURNS语句。
drop function if exists get_id;
delimiter //
CREATE FUNCTION get_id (p_name VARCHAR(20)) RETURNS CHAR(50)
BEGINDECLARE v_id char (8);
select id into v_id from students where name=p_name;
RETURN v_id;
END;
//
delimiter ;
在执行创建函数语句时,出现错误信息:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'END' at line 1
参考MySQL在线文档:18.6. Binary Logging of Stored Programs,将log_bin_trust_function_creators参数值改为1。
mysql> SET GLOBAL log_bin_trust_function_creators = 1;
或者直接在my.cnf的[mysqld]区段加上log-bin-trust-function-creators=1。
调用函数的方法如下:
SELECT get_id('LiaoJL');
Comments
There are currently no comments
New Comment