MySQL编程之一:存储程序和函数

(0 comments)

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)
BEGIN
DECLARE 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');
Currently unrated

Comments

There are currently no comments

New Comment

required

required (not published)

optional

required