MYSQL数据库的基本操作八(存储函数)
一,存储函数的创建,调用,查看,修改,删除
1,创建存储函数drop function if exists func_name; #如果存储函数存在,删除存储函数delimiter // #声明存储函数的结束符为//,可自定义create function func_name([func_parameter])returns type #函数返回的数据类型[characteristic ...] #存储函数特性,创建时一般省略,默认系统设置begin #程序主体开始#中间可写逻辑,包括定义变量,变量赋值,定义条件及处理程序,定义光标及流程控制return value; #存储函数可以通过 return 语句返回函数值,主要用于计算并返回一个值,可以是一个查询结果值end// #程序结束标识符delimiter;'''1, func_parameter #指定存储函数的参数列表,如下:in | out | inout param_name type #in,out,inout 输入输出,param_name 字段名 type 字段类型但是,存储函数默认为in,且参数不写in 没有out,inout 2, DELIMITER//和DELIMITER;两句, DELIMITER是分割符的意思,因为MySQL默认以";"为分隔 符,如果我们没有声明分割符,那么编译器会把存储函数当成SQL语句进行处理,则存储函数的编译过程会报错,所以要事先用DELIMITER关键字申明当 前段分隔符,这样MySQL才会将";"当做存储函数中的代码,不会执行这些代码,用完了之后要把分隔符还原。 3,存储函数的特性 characteristic:COMMENT 'string' 表示注释信息| LANGUAGE SQL 当前系统支持的语言为sql| [NOT] DETERMINISTIC 存储过程执行结果是否确定,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: 子程序包含写数据的语句| SQL SECURITY { DEFINER | INVOKER } 指明谁有权限执行存储函数 DEFINER 只有定义者才能执行 INVOKER 有权限的调用者可执行4,程序主体可以用begin开始,end结束,return返回'''#简单的例字drop function if exists id;delimiter //create function id(re_name varchar(20))returns int(20)begindeclare itep int(20); #定义变量declare not_found condition for 1146; #定义条件declare exit handler for not_found set @info='no_such_table'; #定义处理程序select id into itep from sch where name =re_name; #变量赋值return itep; #返回end//delimiter; #恢复结束符2,调用存储函数select id('xiaojun'); #select 调用存储函数的关键字 add_id 存储函数名称'''注意事项:1)存储函数名称后面必须加括号,哪怕该存储函数没有参数传递'''3,查看存储函数show function status like 'i%'; #1)查看以字母i开头的存储函数状态 \G 有序的展示show create function id ; #2)查看存储函数的定义#3)从information_schema.routines 表中查看存储函数 创建的所有存储函数都存在information_schema库下的routines表select * from information_schema.routines where routine_name = 'id' and routine_type = 'function' ;4,修改存储函数alter function idmodifies sql data #权限修改为MODIFIES SQL DATAsql security invoker; #安全类型改为INVOKERselect * from information_schema.routines where routine_name = 'id' and routine_type = 'function' ;4,删除存储函数drop function if exists id;
二,变量(和存储过程一样)
1,定义变量(局部变量)declare var_name[,varname] type [default value];'''1)declare 声明,定义变量的关键字2)var_name 变量名称3)type 变量类型4)default value 默认值,没有默认NULL '''declare var1 int;declare var2 int default 100;2,局部变量赋值set var_name = expr[,varname=expr...] ; #set 方式赋值select col_name[,...] into var_name[,...] table_expr; #select ... into 方式赋值'''1)var_name col_name 变量名2)expr 变量值3)table_expr 查询条件表达式'''set var1=1,var2=2;select id,name into var1,var2 from test1 where id = 101;3,设置临时变量并赋值(用户变量)set @a = 100select id into @id from test1 where id = 1;4,查询变量select @a,@var1,@var2,@id;5,变量的应用及作用域1)在mysql客户端使用临时变量(用户变量)SELECT 'Hello World' into @x;SELECT @x;SET @y='Goodbye my girl';select @y;SET @z=10+20+30;select @z;2)在存储函数中使用临时变量(用户变量)CREATE function mygirl( )returns varchar(200)beginSET @var='Hello';SELECT CONCAT(@var,' mygirl') into @var;return @var;end;select mygirl( );3)在存储函数间传递全局范围的临时变量(用户变量)CREATE function p1( )returns varchar(200)beginSET @last_function='p1';return @last_function;end;CREATE function p2( )returns varchar(200)beginreturn (concat('Last function was ',' ',(select p1())));end;select p1();select p2();4)变量的作用域'''局部变量/临时变量在其作用域范围内(begin end)代码块之间有效,当执行到end变量时,局部变量/临时变量失效,此时已经在其作用域外。'''
三,定义条件及处理程序(和存储过程一样)
1,定义条件declare condition_name condition for [condition_type];'''1)condition_name 条件名称,可用于处理程序时应用2)condition_type 条件类型,有如下类型:sqlstate sqlstate_value 长度为5的字符串类型错误代码mysql_error_code 数值类型错误代码 '''eg: 定义“ERROR 1148 (42000): The used command is not allowed with this MySQL version”错误有如下定义方法:declare command_not_allowed condition for sqlstate '42000'; #使用sqlstate_value 定义declare command_not_allowed condition for 1148; #使用mysql_error_code 定义
2,定义处理程序declare handler_type handler for condition_value sp_statement;'''1)handler_type 错误处理方式continue (继续)| exit (退出)|undo (撤回,暂不支持)2)condition_value 错误类型sqlstate_value 长度为5的字符串类型错误代码mysql_error_code 数值类型错误代码condition_name 自定义的条件名称sqlwarning 匹配所有以01开头的sqlstate错误代码not found 匹配所有以02开头的sqlstate错误代码sqlexception 匹配没有被sqlwarning,not found捕获的sqlstate错误代码 3)sp_statement 遇到定义的错误时,需要执行的存储过程或函数'''eg: 定义“ERROR 1146 (42S02):Table doesn’t exist” 处理程序有如下方法:declare continue handler for sqlstate '42S02' set @info='no_such_table'; #捕获sqlstate_valuedeclare continue handler for 1146 set @info='no_such_table'; #捕获mysql_error_codedeclare no_such_table condition for 1146;declare continue handler for no_such_table set @info='no_such_table'; #先定义条件,后调用declare exit handler for sqlwarning set @info='error'; #使用sqlwarningdeclare exit handler for not found set @info='no_such_table'; #使用not founddeclare exit handler for sqlexception set @info='error'; #使用sqlexception
四,光标(和存储过程一样)
'''
1)cursor_name 光标名称
2)select_statement 查询结果集
3)var_name 声明光标前定义好的局部变量,用于存储select_statement的结果集
4)光标只能在存储过程或函数中使用
'''
1,声明光标declare cursor_name cursor for select_statement;
2,打开光标open cursor_name;
3,使用光标fetch cursor_name into var_name[,varname...];
4,关闭光标close cursor_name;
五,流程控制(和存储过程有差异)
1,if -then -else -end if条件语句if expr_condition then statement_list;elseif expr_condition then statement_list ...;else statement_list;end if;'''如果expr_condition为真,执行对应的statement_list,如果expr_condition为假,执行else'''drop function if exists boy;delimiter //create function boy(age int)returns varchar(20)beginif age>=0 and age<60then return'不及格';elseif age>=60 and age<80then return '一般';elseif age>=80 and age<=100then return '优秀';else return'数据异常';end if ;end//delimiter;select boy(-10);select boy(10);select boy(70);select boy(90);2,case -when -then -else -end case 条件语句1)case case_exrpwhen when_value then statement_list;when when_value1 then statement_list1;else statement_list;end case;'''1> case_exrp 条件判断表达式,决定执行那个when 子句,适合特定条件的判断2> when_value 表达式可能的值,如果与case_exrp 相同执行when子句,不同执行else 子句3> statement_list 不同when_value 值的执行语句'''drop function if exists person;delimiter //create function person(sex int)returns varchar(200)begincase sexwhen 0 then return '你是男孩';when 1 then return '你是女孩';when 2 then return '你是美人';else return '你需要就医';end case ;end//delimiter;select person(0);select person(1);select person(2);select person(3);2) casewhen expr_condition then statement_list;when expr_condition1 then statement_list1;else statement_list;end case;'''1> expr_condition 条件判断语句,when 语句逐个执行,适合单边2> statement_list 执行语句,当expr_condition为真时执行对应的statement_list,都为假执行else 语句'''drop function if exists person2;delimiter //create function person2(age int)returns varchar(200)begincasewhen age<18 then return '你未成年';when age<40 then return '你很年轻';when age<60 then return '你是中年';when age<100 then return '你是老年';else return '你该休息了';end case ;end//delimiter;select person2(10);select person2(30);select person2(70);select person2(120);3,loop -end loop 循环语句 (循环不需要初始条件,也不需要结束条件,只循环不判断)loop_label:loop #loop_label loop语句的标注名称,可省略statement_list; #需要循环执行的语句,用leave 退出循环 leave loop_labelend loop loop_label;drop function if exists s1;delimiter //create function s1(a int)returns int(10)begindeclare cou int default 0;add_loop:loopset a=a+2;if a>10 then leave add_loop;end if ;set cou=cou+1;end loop;return cou;end//delimiter;select s1(1);4,iterate label, leave label 语句 出现在loop,repeat,while 语句内iterate label #重复循环,执行到条件判断时,如果条件为真返回语句段开头处重复执行 label 循环标注leave label #退出循环,执行到条件判断时,如果条件为真退出循环 label 循环标注drop function if exists s2;delimiter //create function s2(a int)returns int(20)begindeclare cou int default 0;add_loop:loopset a=a+2;if a<=20 then iterate add_loop; #a<=20时,重复执行a=a+2操作elseif a>50 then leave add_loop; #a>50时,退出循环add_loopend if;set cou = cou + 1;end loop add_loop;return cou;end//delimiter;select s2(0);5,repeat -end repeat 语句 (带判断条件的循环语句,执行操作后判断)repeat_label:repeat #repeat_label repeat语句的标注名称,可省略statement_list; #需要循环执行的语句,每次循环后会判断expr_conditionuntil expr_condition #expr_condition 判断表达式,为真时退出循环,否则重复循环end repeat repeat_label;drop function if exists g2;delimiter//create function g2(a int)returns int(20)begindeclare cou int default 0;add_repeat:repeatset a=a+2;set cou=cou+1;until a>50 #每次循环后,判断该条件是否为真,为真退出循环end repeat add_repeat;return cou;end//delimiter;select g2(0);6,while -end while 语句 (带判断条件的循环语句,执行操作前判断)while_label:while expr_codition do #while_label while语句的标注名称,可省略,expr_codition 判断条件,为真时执行循环statement_list; #循环体end while while_label;drop function if exists f2;delimiter//create function f2(a int)returns int(20)begindeclare cou int default 0;add_while:while a<=50 do #先判断条件,为真时执行循环,为假时退出循环set a=a+5;set cou=cou+1;end while add_while;return cou;end//delimiter;select f2(5);
六,查看存储过程
https://mp.csdn.net/mp_blog/creation/editor/121772385
MYSQL数据库的基本操作八(存储函数)相关推荐
- 完全优化MySQL数据库性能的八大巧方法
1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽 ...
- 第六天 02.mysql数据库的基本操作和密码爆破
mysql数据库的基本操作 简介: 数据库是什么 存储数据的仓库,数据是有组织的进行存储. mysql是一种关系数据库管理系统 使用工具:phpstudy mysql 默认端口 3306 一. ...
- MySQL数据库的基本操作流畅版
MySQL数据库的基本操作流畅版 show databases; 查看本地数据库 2. create database oo: 创建名为oo的数据库 use oo: 指定数据库oo(指定了数据库在可以 ...
- mysql数据库读写操作_一看就会,MySQL数据库的基本操作(二)
上一节学习了MySQL数据库的基本操作的几个命令,1.登陆数据库:mysql -h localhost -u root -p.2.查看已有的数据库命令:show databases. 3.创建自己的数 ...
- mysql数据库应用模式与特点_MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述...
MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述: 1.MySQL有多种存储引擎: MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(Berk ...
- linux mysql常用基本操作,Linux下MySQL数据库常用基本操作 一
Linux下MySQL数据库常用基本操作 一 0.登录数据库 mysql -u root -p 1.显示数据库 show databases; 2.选择数据库 use 数据库名; 3.显示数据库中的表 ...
- 1-1 MySQL数据库的基本操作 【增删改查】
1-1 MySQL数据库的基本操作 [增删改查] 一.基础操作 创建数据库 查看数据库 选择数据库 删除数据库 二.建立一个基础数据库 三.基本操作 外键约束与字段自增 数据的增删改 数据查询 数据排 ...
- Qt实战案例(28)——利用QSQL相关类实现对MySQL数据库的基本操作及相关设置详解
目录 一.项目介绍 二.项目基本配置 2.1 安装MySQL 2.2 创建Qt项目 2.3 移动libmysql.dll文件 三.UI界面设计 四.主程序实现 4.1 pro文件 4.2 main.c ...
- 【MySQL】Python3 MySQL数据库的基本操作
[MySQL]Python3 对MySQL数据库的基本操作 安装 MySQL 驱动程序 Python 需要 MySQL 驱动程序来访问 MySQL 数据库. 在此,我选择的驱动程序 是"My ...
最新文章
- mesos+marathon平台搭建
- Django与数据库操作
- cmd运行python服务器,python如何利用paramiko执行服务器命令
- 域名与转发服务器ip指向不一致_域名映射到家庭网络(无公网IP)
- MIUI 10 Android 原生字体,[教程] MIUI10全局字体替换教程,了解一下?
- 小程序制作回到顶部按钮
- leetcode718. 最长重复子数组
- 在浏览器端调试代码并直接修改原文件、移动端虚拟键盘中实现搜索按钮
- Strike price
- 量化交易必读:国内12大量化平台全解析
- 计算机综述论文能发期刊吗,发表计算机算法论文的sci期刊
- object has no attribute 'cleaned_data'
- UWP 禁止Pivot swip 手势
- html5密码确认属性,HTML5表单及其验证【html自带属性验证】
- ac6005直连ap 如何配置_【无线】 AC直连AP配置
- 【数模系列】02_三大相关系数+Python代码
- uniapp解决H5唤醒APP
- idea合并分支只合并某次提交的代码
- 面试官:RecyclerView布局动画原理了解吗?
- Zed Shaw:程序员的常见健康问题