当前位置:嗨网首页>书籍在线阅读

03-存储过程的创建

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

9.2 存储过程的创建

本节视频教学录像:6分钟

创建存储过程,需要使用CREATE PROCEDURE语句,基本语法格式如下。

CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body

下面对创建存储过程各部分语法进行详细说明。

⑴CREATE PROCEDURE 为创建存储过程的关键字。

⑵Sp_name 为存储过程的名称,默认为存储过程与当前数据库关联。要明确地把子程序与一个给定数据库关联起来,可以在创建子程序的时候指定其名字为db_name.sp_name。

⑶proc_parameter指定存储过程的参数列表,列表形式如下。

[IN|OUT|INOUT] param_name type

其中,IN表示输入参数;OUT表示输出参数;INOUT表示既可以输入也可以输出;param_name表示参数名称,type表示参数的类型,该类型可以是MySQL数据库中的任意类型。

⑷characteristics 指定存储过程的特性,有以下的取值。

①LANGUAGE SQL :说明routine_body部分是由SQL语句组成的,当前系统支持的语言为SQL,SQL是LANGUAGE特性的唯一值。

②[NOT] DETERMINISTIC :指明存储过程执行的结果是否确定。DETERMINISTIC 表示结果是确定的,每次执行存储过程时,相同的输入会得到相同的输出;[NOT] DETERMINISTIC 表示结果是不确定的,相同的输入可能得到不同的输出。如果没有指定任意一个值,默认为[NOT] 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 表示只有定义者才能执行;INVOKER 表示拥有权限的调用者可以执行。默认情况下,系统指定为DEFINER。

⑤COMMENT 'string' :注释信息,可以用来描述存储过程或函数。

⑸routine_body是SQL代码的内容,可以用BEGIN...END来表示SQL代码的开始和结束。

本章的例子基于雇员表emp,表中的字段分别为empno(雇员编号)、empname(雇员姓名)、empsex(雇员性别)、empage(雇员年龄)、dno(雇员所在的部门编号),如下所示。

mysql> create table emp -> (empno int primary key, -> empname varchar(20), -> empsex char(2), -> empage int, -> dno int); Query OK, 0 rows affected (0.81 sec)

【范例9-1】

创建存储过程,查询每个部门的雇员人数。

mysql> create procedure pro_emp() -> begin -> select count(eno)as c_emp -> from emp -> group by dno; -> end//

实现过程如下。

⑴创建存储过程名称为pro_emp,该存储过程没有参数,但后面的()必须加上。

⑵使用BEGIN和END来定义了存储过程体。

⑶存储过程是一个简单的SELECT语言,查询不同部门的人数。

【范例9-2】

创建存储过程,查询某个部门的雇员信息。

mysql> create procedure dept_emp(in deptno int) -> begin -> select* -> from emp -> where dno=deptno; -> end// Query OK, 0 rows affected (0.00 sec)

实现过程如下。

(1)创建了存储过程名称为dept_emp。

(2)该存储过程有一个输入参数deptno,该参数用来保存查询的某个部门编号。

(3)在存储过程体中使用where dno=deptno条件语句查询输入的某个部门的雇员信息。

【范例9-3】

创建存储过程,查询女雇员的人数,要求输出人数。

mysql> delimiter // mysql> create procedure count_emp(out cc int) -> begin -> select count(empno)into cc -> from emp -> where empsex='女'; -> end//

实现过程如下。

(1)创建了存储过程count_emp,参数cc为输出类型,接收女雇员的人数。

(2) select count(empno) into cc中的into 语句实现了将count(empno)统计信息赋值给输出参数cc。SQL变量名不能和列名一样。如果SELECT…INTO语句中包含一个对列的引用,并包含一个与列相同名字的局部变量,MySQL当前把参考解释为一个变量的名字。

注意 由括号包围的参数列必须总是存在。如果没有参数,也该使用一个空参数列()。每个参数默认都是一个IN参数。要指定为其他参数,可在参数名之前使用关键词 OUT或INOUT。

以上三个例子比较简单,在存储过程体中只有简单的查询语句,只是利用这3个例子来了解存储过程的创建语法,熟悉存储过程中的参数及其类型,当然存储过程体也可以是很多语句的复杂组合,完成更为复杂的操作。