关于mysql的函数与存储过程的举例:
/*创建teacher*/
CREATE table teacher(
id INT(4) NOT NULL PRIMARY KEY auto_increment,
num INT(10) not NULL UNIQUE,
tname VARCHAR(20) NOT NULL,
sex VARCHAR(4) not NULL,
birthday DATE,
address VARCHAR(50)
);
/*向表teacher中插入数据*/
insert into teacher(num,tname,sex,birthday,address) VALUES
(1001,‘张三‘,‘男‘,‘1984-11-08‘,‘北京市昌平区‘),
(1002,‘李四‘,‘女‘,‘1970-01-21‘,‘北京市海淀区‘),
(1003,‘王五‘,‘男‘,‘1976-10-30‘,‘北京市昌平区‘),
(1004,‘赵六‘,‘男‘,‘1980-06-05‘,‘北京市顺义区‘);
/*1、创建存储过程tea_pro,其包含3个参数,输入参数teacher_id和type,
输出参数为info,存储过程的作用是根据编号(teacher_id)来查询teacher表中的记录,
如果type的值为1时,将姓名(name)传给输出参数info;当type的值为2时,
将年龄传给输出参数info;如果type为其他值,则返回字符串‘Error’。*/
DELIMITER //
CREATE PROCEDURE tea_pro(in teacher_id INT, in type int , out info CHAR(10))
reads SQL DATA
BEGIN
IF type=1
THEN
(SELECT tname into info FROM teacher where id=teacher_id);
ELSEIF type=2
THEN
SELECT year(now())-year(birthday) INTO info FROM teacher WHERE ID=teacher_id;
ELSE
set info=‘error‘;
END if;
END
//
CALL tea_pro(1,1,@name);
SELECT @name as ‘姓名‘;
CALL tea_pro(1,2,@age);
SELECT @age as ‘年龄‘;
CALL tea_pro(1,4,@age);
SELECT @age as ‘Error‘;
/*2、创建存储函数teacher_info2,有2个参数teacher_id和type。存储函数的作用
根据编号(teacher_id)来查询teacher的记录,如果type值为1时,返回姓名,如果
type为2时,返回年龄,如果type为其他值,返回字符串‘Error‘*/
DELIMITER //
CREATE FUNCTION teache_info2(teacher_id INT,type INT)
RETURNS char(10)
BEGIN
DECLARE result CHAR(10);
IF type=1
THEN
set result=(SELECT tname FROM teacher where id=teacher_id);
return result;
ELSEIF type=2
THEN
SELECT year(now())-year(birthday) INTO result FROM teacher WHERE ID=teacher_id;
return result;
ELSE
set result=‘error‘;
return result;
END if;
END
//
SELECT teache_info2(1,1) as ‘姓名‘;
SELECT teache_info2(1,2) as ‘年龄‘;
SELECT teache_info2(1,5) as ‘Error‘;
函数与存储过程基本相似,但依然存在区别,编写时请注意:
1、标识符不同。函数的标识符为FUNCTION,过程为:PROCEDURE。2、函数中有返回值,且必须返回,而过程没有返回值(其实不能这么说,存储过程存在输出值)。3、两者调用方式不同。4、函数可以在select语句中直接使用,而过程不能,例如:假设已有函数fun_getAVG() 返回number类型绝对值。那么select fun_getAVG(col_a) from table 这样是可以的。 注意:sql语句中"@"是:局部变量声明,如果没有"@"的字段代表是列名;