版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、生物信息学数据库设计,第六章 MySQL存储过程,存储过程的概念,所谓的存储过程就是存储在数据库当中的可 以执行特定工作(查询和更新)的一组SQL 代码 的程序段。 与自定义函数的区别: 自定义函数有且只有一个返回值,就像普通 的函数一样,可以直接在表达式中嵌入调用。 存储过程可以没有返回值,也可以有任意个 输出参数,必须单独调用。,执行的本质都一样。只是函数有如只能返回一个变量的限制。而存储过程可以返回多个。而函数是可以嵌入在sql中使用的,可以在select中调用,而存储过程不行。 函数限制比较多,比如不能用临时表,只能用表变量。还有一些函数不可用等等。而存储过程的限制相对就比较少。,一般
2、来说,存储过程实现的功能要复杂一 点,而函数的实现的功能针对性比较强。 对于存储过程来说可以返回参数,而函数 只能返回值或者表对象。 存储过程一般是作为一个独立的部分来执 行,而函数可以作为查询语句的一个部分来 调用,由于函数可以返回一个表对象,因此 它可以在查询语句中位于FROM关键字的后 面。,存储过程的优点,存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。 当对数据库进行复杂操作时(如对多个表进行Update、Insert、Query、Delete时),可将此复杂操作用存储过程封装起来与数据库提
3、供的事务处理结合一起使用。 存储过程可以重复使用,可减少数据库开发人员的工作量。 安全性高,可设定只有某此用户才具有对指定存储过程的使用权。,基本的创建、删除语法,CREATE PROCEDURE sp_name (proc_parameter,.) characteristic . routine_body 默认地,子程序与当前数据库关联。要明确地把子程序与一个给定数据库关联起来,可以在创建子程序的时候指定其名字为db_name.sp_name。 sp_name 存储过程的名字 proc_parameter指定参数为IN, OUT,或INOUT characteristic 特征 routi
4、ne_body 包含合法的SQL过程语句。,in 把数据从外部传递给存储过程 out 从存储过程内部返回值给外部使用者 inout 把数据传递给存储过程和将存储过程的返回值传递给外部使用者,DROP PROCEDURE | FUNCTION IF EXISTS sp_name 这个语句被用来移除一个存储程序或函数。即,从服务器移除一个制定的子程序。在MySQL 5.1中,你必须有ALTER ROUTINE权限才可用此子程序。这个权限被自动授予子程序的创建者。 IF EXISTS 子句是一个MySQL的扩展。如果程序或函数不存在,它防止发生错误 show procedure status; 查看
5、存储过程状态,delimiter / DROP PROCEDURE IF EXISTS sp_test / CREATE PROCEDURE sp_test /* 存储过程名 */ (IN inparms INT,OUT outparams varchar(32) /* 输入参数 */ BEGIN /* 语句块头 */ DECLARE var CHAR(10); /* 变量声明 */ DECLARE num int; IF inparms = 1 THEN /* IF条件开始*/ SET var = hello; /* 赋值 */ ELSE SET var = world; END IF; /
6、* IF结束 */ INSERT INTO t1 VALUES (var); /* SQL语句 */ select count(*) from t1 into num; SELECT name FROM t1 LIMIT num, 1 INTO outparams; END / delimiter ; call sp_test(1, out); Select out; 事先创建表 create table t1(id int not null auto_increment,name varchar(45),primary key pk_id (id);,存储过程的变量,声明变量: DECLAR
7、E var_name,. type DEFAULT value 这个语句被用来声明局部变量。要给变量提供一个默认值 ,需要包含一个DEFAULT子句。值可以被指定为一个表达式 ,不需要为一个常数。如果没有DEFAULT子句,初始值为 NULL。 局部变量的作用范围在它被声明的BEGIN . END块内。它 可以被用在嵌套的块中,除了那些用相同名字声明变量的块。,变量赋值,变量赋值,SET语句: SET var_name = expr , var_name = expr . 也可以用语句代替SET来为用户变量分配一个值。在这种 情况下,分配符必须为:=而不能用=,因为在非SET语句中= 被视为一
8、个比较 操作符, 如下所示: mysql SET t1=0, t2=0, t3=0; mysql SELECT t1:=0,t2:=0,t3:=0; 对于使用select语句为变量赋值的情况,若返回结果为空 ,即没有记录,此时变量的值为上一次变量赋值时的值,如 果没有对变量赋过值,则为NULL。,变量赋值,SELECT . INTO语句 SELECT col_name,. INTO var_name,. table_expr这个SELECT语法把选定的列直 接存储到变量。因此,只有单一的行可以被 取回。 SELECT id,data INTO x,y FROM test.t1 LIMIT 1;
9、,BEGIN.END复合语句,begin_label: BEGIN statement_list END end_label 存储子程序可以使用BEGIN . END复合语句来包含多个语句。 statement_list 代表一个或多个语句的列表。statement_list之内 每个语句都必须用分号(;)来结尾。 复合语句可以被标记。除非begin_label存在,否则end_label不 能被给出,并且如果二者都存在,他们必须是同样的。 使用多重语句需要客户端能发送包含语句定界符;的查询字符串 。这个符号在命令行客户端被用delimiter命令来处理。改变查询 结尾定界符;(比如改变为/)
10、使得; 可被用在子程序体中。,流程控制,IF语句 IF search_condition THEN statement_list ELSEIF search_condition THEN statement_list . ELSE statement_list END IF IF实现了一个基本的条件构造。如果search_condition求 值为真,相应的SQL语句列表被执行。如果没有 search_condition匹配,在ELSE子句里的语句列表被执行。 statement_list可以包括一个或多个语句。,举例: DELIMITER / CREATE PROCEDURE p1(IN p
11、arameter1 INT) BEGIN DECLARE variable1 INT; SET variable1 = parameter1 + 1; IF variable1 = 0 THEN INSERT INTO t VALUES (17); END IF; IF parameter1 = 0 THEN UPDATE t SET s1 = s1 + 1; ELSE UPDATE t SET s1 = s1 + 2; END IF; END / DELIMITER ;,CASE语句 CASE case_value WHEN when_value THEN statement_list WH
12、EN when_value THEN statement_list . ELSE statement_list END CASE Or: CASE WHEN search_condition THEN statement_list WHEN search_condition THEN statement_list . ELSE statement_list END CASE,存储程序的CASE语句实现一个复杂的条件构造。如果search_condition 求值为真,相应的SQL被执行。如果没有搜索条件匹配,在ELSE子句里的语句被执行。 举例: CREATE PROCEDURE p2 (IN
13、 parameter1 INT) BEGIN DECLARE variable1 INT; SET variable1 = parameter1 + 1; CASE variable1 WHEN 0 THEN INSERT INTO t VALUES (17); WHEN 1 THEN INSERT INTO t VALUES (18); ELSE INSERT INTO t VALUES (19); END CASE; END/,循环语句 WHILE END WHILE 举例: CREATE PROCEDURE p4 () BEGIN DECLARE v INT; SET v = 0; WH
14、ILE v = 5 THEN LEAVE loop_label; END IF; END LOOP; END / begin_label: LOOP statement_list END LOOP end_label LOOP允许某特定语句或语句群的重复执行,实现一个简单的循环构造。在循环内的语句一直重复直到循环被退出,退出通常伴随着一个LEAVE 语句。,补充:迭代(ITERATE)语句 CREATE PROCEDURE p7 () BEGIN DECLARE v INT; SET v = 0; loop_label: LOOP IF v = 3 THEN SET v = v + 1; IT
15、ERATE loop_label; END IF; INSERT INTO t VALUES (v); SET v = v + 1; IF v = 5 THEN LEAVE loop_label; END IF; END LOOP; END /,注释语法: mysql存储过程可使用两种风格的注释 双模杠:-,该风格一般用于单行注释 c风格:/* 注释内容 */, 一般用于多行注释 使用权限: CREATE ROUTINE 建立存储过程 ALTER ROUTINE 编辑和删除存储过程 EXECUTE 执行存储过程,条件和异常处理程序,DECLARE handler_type HANDLER FO
16、R condition_value,. sp_statement handler_type: CONTINUE | EXIT condition_value: SQLSTATE VALUE sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION 这个语句指定每个可以处理一个或多个条件的处理程序。如果产生一个或多个条件,指定的语句被执行。 对一个CONTINUE处理程序,当前子程序的执行在执行处理程序语句之后继续。对于EXIT处理程序,当前BEGIN.END复合语句的执行被终止。,SQLWARNING是对所有
17、以01开头的SQLSTATE代码的速记。 NOT FOUND是对所有以02开头的SQLSTATE代码的速记。 SQLEXCEPTION是对所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATE代码的速记。 声明自定义条件: DECLARE condition_name CONDITION FOR condition_value condition_value: SQLSTATE VALUE sqlstate_value,举例: CREATE TABLE t2 (s1 int,primary key (s1); delimiter / CREATE PROCEDURE hand
18、lerdemo() BEGIN DECLARE CONTINUE HANDLER FOR SQLSTATE 23000 SET x2 = 1; SET x = 1; INSERT INTO t2 VALUES (1); SET x = 2; INSERT INTO t2 VALUES (1); SET x = 3; END/ delimiter ;,游标,声明游标 DECLARE cursor_name CURSOR FOR select_statement 这个语句声明一个光标。也可以在子程序中定义多个光标,但是一个块中的每一个光标必须有唯一的名字。 打开游标 OPEN cursor_nam
19、e 这个语句打开先前声明的光标。 游标FETCH FETCH cursor_name INTO var_name , var_name . 这个语句用指定的打开光标读取下一行(如果有下一行的话), 并且前进光标指针。,关闭游标CLOSE CLOSE cursor_name 这个语句关闭先前打开的光标。 如果未被明确地关闭,光标在它被声明的复合语句的末 尾被关闭。 游标的特性: READ ONLY 只读,只能取值而不能赋值; NOT SCROOLABLE 不可回滚,只能顺序读取; ASENSITIVE 敏感,不能在已经打开游标的表上执行 update事务;,举例: create table stu_sumscore(name char(16),sum
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/TMAC 163-2025新能源汽车电子后视镜技术要求
- T/GDAF 005-2022广东公共安全技术防范标准化试点管理规范
- T/CI 344-2024低温冷风微量润滑平面磨削加工工艺规范
- T/CAAMTB 94-2022汽车车窗玻璃用加速固化聚氨酯胶粘剂
- T/CPMIA 0107-2026注射成型车间智能制造执行系统 (MES)
- AI在体育教育中的应用
- 2025~2026学年安徽宣城市郎溪县人教版六年级下册期末数学试卷【附答案】
- 2025-2026学年吉林省舒兰市初中数学九年级期末下册自测模拟重点试题(附答案)
- PHP微信开发面试题及详细答案(实战版)
- Photoshop考试试题汇编(完整版)
- 统编版九年级上册 道德与法治 第二单元《进入新时代》单元检测试卷(含答案)
- 2026新教材语文 7 培养德智体美劳全面发展的社会主义建设者和接班人 课件
- 冷库工程监理实施细则
- 变压器装配工岗中理论实操考核试卷含答案
- 2026年国家能源投资集团有限责任公司校园招聘考试题库及答案解析
- 2026年三星 (中国) 半导体有限公司招聘(西安有岗)笔试备考题库及答案详解
- DB37T5324-2025房屋建筑工程施工安全监督技术规程
- XX光伏电站电力网络信息系统安全事故应急预案
- 2024版《建设工程工程量清单计价标准》解读课件
- 2026年湖北公务员考试申论试题(县乡卷)及答案
- 2026中远海运集团招聘笔试历年参考题库附带答案详解
评论
0/150
提交评论