MySQL中使用用户自定义的函数

函数定义基本公式如下

create function function_name(function_param param_type)
returns return_type
begin 
	function_body
end

过程定义的基本公式(与函数类似)

create procedure procedure_name(in in_param_name param_type, out out_param_name param_type)
begin
	procedure_body
end

注: 包含在begin与end中间是作为一个单独的事务来执行

其他语法

while 布尔表达式 do
	语句序列;
end while;

repeat 	语句序列;
util 布尔表达式
end repeat

if 布尔表达式
	then 语句或复合语句
elseif 布尔表达式
	then 语句或复合语句
else 语句或复合语句
end if

实例

向表中插入一个学生,完成课程登记,对应《数据库系统概念》p99

# 函数实例
create function dept_count(dept_name varchar(20))
    returns integer
    begin
        declare d_count integer;
        select count(*) into d_count
        from instructor
            where instructor.dept_name = dept_name;
        return d_count;
    end;

select dept_name, budget
from department
where dept_count(dept_name) > 0;

# 过程实例
create procedure instructor_of (dept_name varchar(20))
    begin
            select ID,name,dept_name,salary
            from instructor
            where instructor.dept_name = dept_name;
    end

call instructor_of('Finance');

# 插入学生
create function registerStudent5(
        s_id varchar(5),
        s_courseid varchar(8),
        s_secid varchar(8),
        s_semester varchar(6),
        s_year numeric(4, 0),
        errorMsg varchar(100)
) returns integer
begin
        declare currEnrol integer;
        declare relLimit integer;

        select count(*) into currEnrol
        from takes
        where course_id = s_courseid and sec_id = s_secid
                and semester = s_semester and year = s_year;

        select capacity into relLimit
        from classroom natural join section
        where course_id = s_courseid and sec_id = s_secid
                and semester = s_semester and year = s_year;

        if(currEnrol < relLimit) then
            begin
                insert into takes values
                    (s_id, s_courseid, s_secid, s_semester, s_year, null);
                return (0);
            end;
        else
            set errorMsg = 'Error';
            return (-1);
        end if;
end;
posted @ 2020-12-03 21:08  herrhu  阅读(266)  评论(0)    收藏  举报