存储过程
创建存储过程语法:
create procedure 存储过程名 (参数1,参数2,。。。)
[存储过程选项]
begin
存储过程语句块
end;
存储过程的优点:
- 提高了SQL语言的重用性,共享性和可移植性
- 能够实现较快的执行速度,能够减少网络流量
- 可以作为一种安全机制来利用
存储过程选项:
- LANGUAGE SQL:表示存储过程语句块由SQL语言组成(如果不特意写默认就是该选项)
- [NOT] DETERMINISTIC 表示存储过程的结果是否确定,deterministic表示执行结果确定的如果输入相同的参数将会得到相同的输出(默认值为deterministic)
- [CONTAINS SQL | NO SQL |READS SQL DATA |MODIFIES SQL DATA ]表示使用SQL语句的限制,如果值为CONTAINS SQL 表示包含SQL语句,但不包含读或写数据的语句。NO SQL 表示不包含SQL语句。READS SQL DATA 包含读数据的语句。 MODIFIES SQL DATA表示包含写数据的语句。默认值为CONTAINS SQL。
- SQL SECURITY {DEFINER|INVOKER}设置谁有权限来执行,默认值为DEFINER
- COMMENT ‘string’,表示注释语句
存储过程有三种参数:
in参数:表示输入类型,参数只能输入到储存过程内部使用,不能对外进行返回参数,也不会修改外部的数据。
out 参数:表示输出类型,参数不能从外部输入存储过程使用,传入不了,但是在内部产生的数据可以返回到外部对原有数据进行修改覆盖。
inout 参数:表示输入输出类型,参数可以传入也可传出
存储过程的调用:call 储存过程名(参数);
__查询所有计算机学生利用存储过程不带参数
DELIMITER //
CREATE PROCEDURE p_student()
BEGIN
SELECT *
FROM student
WHERE sdept='计算机系';
END;
//
DELIMITER ;
——查询所有计算机学生利用存储过程带参数
DELIMITER //
CREATE PROCEDURE p_student1(in ximing char(10))
BEGIN
SELECT *
FROM student
WHERE sdept=ximing;
END;
//
DELIMITER ;
CALL p_student1('计算机系');
调用法二:
set @x='计算机系';
call p_stdent1(@x);
__计算任意给定课程的平均分,多参数
DELIMITER //
CREATE PROCEDURE p_stusp(IN kecheng CHAR(10),OUT num NUMERIC(5,2))
BEGIN
SELECT AVG(grade)INTO num
FROM sc JOIN course ON sc.cno=course.cno
WHERE cname=kecheng;
SELECT CONCAT(kecheng,'课程的平均成绩为:',num,'分');
END;
//
DELIMITER;
SET @num=0;
CALL p_stusp('VB',@num);