存储过程是一组为了完成某特定功能的SQL语句集,其实质上就是一段存放在数据库中的代码。他可以由声明式的SQL语句(如CREATE, UPDATE 和SELECT等语句)和过程式(如IF-THEN-ELSE等)组成。 优点: 1. 可增强SQL语言的功能和灵活性。 2. 具有良好的封装性 3. 高性能 4. 可减少网络流量 5. 存储过程可作为一种安全机制来确保数据可的安全性和数据的完整性。
CREATE PROCEDURE sp_name ([proc_parameter[, …]]) [characteristic…] routine_body 说明如下: Sp_name: 存储过程的名称,默认在房钱数据库中创建。需要在特定数据库中创建存储过程时,则要在名称前面加上数据库的名称 比如:db_name.sp_name; Proc_parameter: 存储过程中的参数列表。其中包括三项:[IN|OUT|INOUT] param_name type. 存储过程支持三种参数,输入参数,输出参数,以及输入输出参数。对应IN OUT INOUT。 输入参数可以使数据传递给一个存储过程。输出参数用于存储过程需要返回一个操作结果的情形。而输入输出参数具有上述两种的特性。下面两项是参数名称和参数类型 Characteristic: 存储过程中的某些特征设定 ,下面分别介绍 1.COMMENT ‘string’: 用于对于存储过程的描述,其中string为描述内容,COMMENT为关键字。此信息可以通过SHOW CREATE PROCEDURE语句显示 2.LANGUAGE SQL: 指明编写此过程的语言为SQL语言,目前而言,MySQL存储过程还无法用外部编程语言来编写,也就是说,这个选项可以不选定。今后MYSQL会对其进行扩展。 3.DETERMINISTIC: 如若设置此参数,则对于同样的输入参数会产生相同的结果。 若设置为NOT DETERMINITIC ,则会产生不确定的结果。默认为后者。 4.CONTAINS SQL | NO SQL | READS SQL DATA |MODIFIES SQL DATA: CONTAINS SQL代表存储过程含读或写的数据。 NO SQL 表示存储过程不包含SQL ,语句, 下面两项分别是只含读或者只含写。 5.SQL SECURITY: 这个特征用来指定存储过程使用创建该存储过程的用户的许可来执行还是使用调用者的许可来执行。默认使用用户。
Routine_body:存储过程的主体部分 其包含了该存储过程中需要执行的SQL语句,以关键字BEGIN开始,以END 结束。这对关键字还可以嵌套使用。
1. 声明局部变量 a) 语法: DECLARE var_name [,…] type [DEFAULT value] b) Var_name: 用于指定局部变量的名称 c) Type: 用于声明局部变量的数据类型 d) DEFAULT子句用于为局部变量指定一个默认值,默认为空(NULL) e) 使用说明: i. 局部变量只能在存储过程体内的BEGIN ..END 语句块中声明 ii. 局部变量必须在存储过程体的开头处声明 iii. 其作用范围仅限于声明它的BEGIN …END语句块中,其他块中不可使用 iv. 局部变量与用户变量不同。声明用户变量时需前加@。 2. SET 语句 使用SET 语句为局部变量赋值。 SET var_name = expr 3. SELECT … INTO 语句 a) 语法:SELECT col_name […] INTO var_name[…] table_expr b) Col_name:用于指定列名 c) Var_name;用于指定要赋值的变量 d) Table_expr: 表示SELECT 语句中FROM子句及其后面的语法部分 e) 说明:该语句返回的结果集只能有一行 4. 流程控制语句 a) 条件判断语句 i. 语法:IF serach_condition THEN statement_list [ELSEIF search_condition THEN statement_list]… [ELSE statement_list] END IF ii. Serach_condition:用于指定判断条件 iii. Statement_list:用于包含一句或多句SQL语句 iv. 只有当判断条件为真时,才会执行相应的SQL语句 v. 该流程控制语句不同于系统内置函数IF() b) 选择CASE语句 i. 语法:CASE case_value WHEN When_value THEN statement_list ELSE statement_list END CASE ii. 第二种语法: CASE WHEN search_condition THEN statement_list ….. ELSE statement_list END CASE iii. 第二种语法较为常用,并且使用起来更加方便 c) 循环语句 i. WHILE语句 ii. REPEAT语句 iii. LOOP语句 iv. 退出 1. LEAVE 结束整个循环 2. ITERATE 退出当前循环 v. 游标问题 1. 在上述文章中提到SELECT INTO语句,其结果返回的是带有值的一行数据,然而在使用SELECT 语句进行检索数据时,若该语句被成功执行,则会返回一组成为结果集的数据行,其可能拥有多行数据,这些数据无法被一行一行的处理,此时需用到游标。简而言之,游标就是一个被SELECT语句检索出来的结果集,在存储游标之后,就可以根据需要滚动或浏览器中的数据。 2. 注意: a) MYSQL中对游标的支持实在5.0版本开始的,之前的MYSQL版本无法使用游标。 b) 游标只能用在存储过程或者存储函数中,不能单独在查询操作中使用 c) 可定义多个游标,但其名称必须唯一 d) 其不是一条SELECT语句,而是SELECT检索出来的结果集 3. 声明游标 a) DECLARE cursor_name CURSOR FOR select_statement b) Cursor_name: 游标的名称 c) Select_statement: 指定一个SELECT 语句,返回一行或多行结果,不可含有INTO子句 4. 打开游标 a) 在定义游标之后,必须打开游标才能使用,这个过程实际上就是将游标连接到SELECT语句返回的结果集中 b) 语法格式:OPEN cursor_name c) 一个游标可被多次打开,由于其他用户或者应用程序可能随时更新了数据表,因此每次打开游标的结果集可能会不同 5. 读取数据 a) 对填有数据的游标,可根据需要取出数据。 b) 语法结构:FETCH cursor_name INTO var_name[,…] c) Cursor_name: 用于指定已打开的游标 d) Var_name: 用于指定存放数据的变量名 6. 关闭游标 a) 结束游标使用时,必须将其关闭 b) CLOSE cursor_name c) 每个游标不再使用时,都需要将其关闭,使用CLOSE语句将会释放游标所使用的全部资源。关闭后,如果没有再次重新打开,则该游标不能被重新使用,对于声明过的游标,则不需要再次声明,可直接使用OPEN打开, 另外,如果忘记关闭游标,MYSQL在到达END语句时会自动关闭。
新闻热点
疑难解答