版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MySQL存储过程和函数汇报人:Kimi
AI时间:2025/01/01CONTENTS目录01MySQL编程基础定界符delimiter·begin...end语句块·MySQL注释方式·系统会话变量·用户会话变量·局部变量·MySQL表达式02控制流语句IF判断语句·CASE多分支语句·WHILE当型循环·REPEAT直到型循环·LOOP循环与LEAVE·ITERATE语句03存储过程存储过程创建·参数类型IN/OUT/INOUT·Characteristic选项·存储过程调用·修改与删除操作04自定义函数函数创建语法·RETURNS返回类型·GRANTROUTINE权限·函数调用与管理·存储过程对比05本章小结知识点回顾·综合应用·学习成果01MySQL编程基础015.1OVERVIEWMySQL编程基础概述存储过程与函数的价值存储过程和函数是MySQL中独立的数据库对象,能够支持过程性编程,通过数据库系统封装和编译,能提高数据库编程的复用性,加快数据综合处理速度,从而提升数据库操作效率。本章学习目标本章介绍MySQL中常量、变量、函数、表达式、关键词等MySQL编程基础,三种基本结构即顺序结构、选择结构和循环结构等控制流语句,存储过程、函数的创建及调用等内容。本章重点内容MySQL变量的定义和使用系统会话变量、用户会话变量、局部变量的声明、赋值与使用规则控制流语句的实现IF判断语句、CASE多分支语句、WHILE/REPEAT/LOOP循环语句的应用存储过程和函数的创建与调用存储过程与自定义函数的语法结构、参数传递、管理维护等核心技能学习建议本章结合大量案例解释知识点,建议读者跟随示例进行实际操作,通过实践加深对MySQL数据库中控制流语句、存储过程和函数应用的理解。5.1.1定界符delimiter与begin...end语句块定界符delimiterSQL语句默认结束符为;,而在存储过程、函数或触发器等存储程序中,会包含多条SQL语句的执行,所以这些存储程序最终结束符就不能再用;,否则数据库系统解释器将报错处理。这种情况下需要为存储过程、函数或触发器等存储程序重新定义一个提交系统执行的结束符,例如$$或&&、%%等,系统解释器会将这些结束符视为解释运行的标志。示例:重新定义结束符--将结束符改为%%mysql>delimiter%%mysql>SELECT*FROMtable%%--将结束符改为##mysql>delimiter##mysql>SELECT*FROMtable##--恢复默认结束符mysql>delimiter;begin...end语句块MySQL中使用begin...end描述语句块,语句块只能用在存储过程、函数或触发器等存储程序中,单独使用系统解释器将报错。语法格式:BEGIN自定义变量声明;其他控制语句;END;--end后面谨记需要用";"结束使用要点1定界符delimiter重新定义的结束符只在当前会话有效2begin...end必须成对出现,且只能用于存储程序中3end后面必须加";"表示语句块结束4创建存储程序后记得恢复默认结束符5.1.1MySQL注释方式MySQL语句中有单行注释和多行注释两种方式,合理使用注释可以提高代码的可读性和可维护性。#井号注释单行注释从该符号到此行结束属于注释部分,是最常用的单行注释方式。语法示例:#这是一个注释SELECT*FROMtable;--双横杆注释单行注释从该符号到此行结束属于注释部分,注意双横杆后需加一空格。语法示例:--这是一个注释SELECT*FROMtable;/**/多行注释块注释注释部分从/*开始,到*/结束,可以跨越多行。语法示例:/*这是多行注释可以写多行内容*/实际应用示例--查询李姓病人的信息SELECT*FROMPatientsWHEREPatientNameLIKE‘李%’;
/*查询眼科医生且工龄在10年以上的医生信息*/SELECT*FROMDoctorsWHERESpecialization=ANDworkingyears>10;SELECT*FROMtable;5.1.2MySQL变量MYSQL系统中每个用户客户端连接服务器称之为一次会话,会话期间,MYSQL服务实例中可访问的变量有系统会话变量、用户会话变量,除此之外,用户还可以根据需要声明自定义局部变量。系统会话变量以@@开头系统定义的变量,用于控制数据库系统的行为和配置。注意:大小写不敏感;无需声明,直接访问格式:以@@开头示例:SELECT@@version;用户会话变量以@开头用户自定义的变量,用于在会话期间存储临时数据。注意:大小写不敏感;无需声明;生命周期在本次会话有效
格式:以@开头示例:SET@sum=10+20;局部变量用DECLARE声明在存储程序中定义的临时变量,仅在语句块内有效。声明:DECLARE范围:语句块内规则:先声明后使用用途:语句块中使用
示例:DECLAREvar_dateDATE;SYSTEMVARIABLES系统会话变量详解系统会话变量特点系统会话变量对大小写不敏感,且无需声明,可直接访问,格式上系统会话变量通常以两个"@"符号开头。查询变量值SELECT@@variable_name;设置变量值SET@@variable_name=value;常用系统变量示例1@@versionMySQL服务器版本号2@@sql_safe_updates安全更新检查开关3@@global.log_bin_trust_function_creators二进制日志信任参数示例:查询版本信息mysql>SELECT@@version;+-----------+|@@version|+-----------+|8.0.21|+-----------+示例:设置安全更新检查--关闭安全更新检查mysql>SET@@sql_safe_updates=0;--查询当前设置mysql>SELECT@@sql_safe_updates;+-------------------+|@@sql_safe_updates|+-------------------+|0|+-------------------+USERVARIABLES用户会话变量详解用户会话变量特点用户会话变量大小写不敏感,无需声明,格式上通常以一个"@"符号开头,生命周期为本次连接会话期间有效。赋值语法:SET@var_name=expression;SELECT@var_name:=expression;SELECTexpressionINTO@var_name;赋值方式对比SET命令SET@sum=10+20;:=运算符SELECT@sum:=10+20;INTO子句SELECT10+20INTO@sum;示例:SET命令赋值mysql>SET@sum=10+20;mysql>SELECT@sum;+--------+|@sum|+--------+|30|+--------+示例:SELECT赋值与查询mysql>SELECT@pname:=PatientNameFROMPatientsLIMIT1;mysql>SELECT@pname;+-------------+|@pname|+-------------+|张文文|+-------------+重要提示:用户会话变量在本次连接会话期间有效,会话结束后变量自动销毁。在存储过程中使用用户会话变量可以实现跨语句的数据传递。LOCALVARIABLES局部变量的声明与使用局部变量定义与特点局部变量定义在程序语句块中,有效范围在该语句块范围内,MySQL中语句块用begin...end描述。声明与赋值:DECLAREvar_nametype;DECLAREvar_nametypeDEFAULTvalue;SETvar_name=expression;使用规则1使用范围限定只能使用在存储过程、函数、触发器等存储程序中2声明位置要求在其begin...end语句块中声明并使用3使用顺序规则遵循先声明后使用原则4参数传递功能可作为存储过程或函数的形参示例:局部变量声明--声明日期类型变量DECLAREvar_dateDATEDEFAULT--声明字符类型变量DECLAREvar_strCHAR(10);--使用SET赋值SETvar_str=示例:存储过程中使用CREATEPROCEDUREproc_example()BEGINDECLAREcountINTDEFAULT0;SETcount=count+1;END;注意:局部变量与用户会话变量(以@开头)是完全不同的变量体系,不能混用。5.1.3MySQL表达式全面解析什么是MySQL表达式MySQL表达式是指在SQL查询中用于计算、比较和逻辑判断的公式或语句。MySQL表达式由操作数和运算符构成,常见的操作数包括常数、列名、函数调用等,运算符则包括算术运算符、比较运算符和逻辑运算符。按值的类型分类数值型表达式如:1+2,price*quantity字符型表达式如:'a'>'b',CONCAT(name)日期型表达式如:curdate()+5按值的形式分类1标量表达式单个值,如:数值、字符串、日期2行表达式单行多列,如:('张三',25,'M')3表表达式多行多列的结果集合按表达式形式分类单一表达式结果为一个单一的值复合表达式由多个单一表达式组合而成表达式应用说明表达式在MySQL中广泛应用于SELECT查询、WHERE条件、SET赋值、IF判断等场景。掌握表达式的构建规则是编写高效SQL语句的基础。APPLICATION表达式实例与应用通过实际代码示例展示不同类型表达式的应用:数值型表达式、字符比较表达式、日期运算表达式,说明不同表达式类型的计算规则和返回值特点。表达式示例mysql>SELECT1+2,'a'>'b',curdate()+INTERVAL5day;+-----+-------+-----------------------------+|1+2|'a'>'b'|curdate()+INTERVAL5day|+-----+-------+-----------------------------+|3|0|2025-01-20|+-----+-------+-----------------------------+数值型表达式SELECT1+2;--结果:3SELECTprice*quantityFROMorders;SELECTAVG(score)FROMstudents;用于数学计算,返回数值类型的结果字符型表达式SELECT'a'>'b';--结果:0SELECTname='张三'FROMusers;SELECTCONCAT(first,last)FROMemployees;用于字符比较和字符串操作,返回字符或布尔值日期型表达式SELECTCURDATE()+INTERVAL5DAY;--结果:2025-01-20SELECTDATEDIFF(NOW(),birth)FROMusers;用于日期时间计算,返回日期或时间类型02控制流语句025.2OVERVIEW控制流语句概述控制流语句的核心价值编译程序语句中有控制流语句,MySQL语句亦然。控制流的三种基本结构,分别是顺序、选择和循环结构,通过控制流语句可实现判断、循环等逻辑操作,常设计在存储过程、函数和触发器等存储程序中,用于解决复杂的数据处理问题。01顺序结构程序语句按照先后顺序依次执行,是最基本的程序结构。在MySQL中,默认情况下SQL语句就是顺序执行的。示例:BEGIN语句1;语句2;语句3;END;02选择结构根据条件判断,选择性地执行不同的语句块。MySQL提供IF和CASE两种选择结构语句。示例:IF条件THEN语句块1;ELSE语句块2;ENDIF;03循环结构根据条件重复执行语句块。MySQL提供WHILE、REPEAT和LOOP三种循环结构语句。示例:WHILE条件DO语句块;ENDWHILE;5.2.1IF判断语句语法结构IF语句语法格式IF条件表达式THEN语句块;[可选部分][ELSEIF条件表达式THEN语句块;][ELSE语句块;]ENDIF;IF语句特点可实现单分支和多分支判断条件成立则执行THEN后面的语句块可连续使用ELSEIF进行多条件判断所有条件都不满足则执行ELSE语句单分支IF结构IF条件表达式THEN执行语句;ENDIF;多分支IF结构IF条件1THEN语句块1;ELSEIF条件2THEN语句块2;ELSE语句块3;ENDIF;语法要点•endif后面需用";"结束该条件语句•条件表达式的结果应为布尔值•else子句是可选的,但建议使用以处理异常情况EXAMPLE5-2IF语句实例:医生从业年限判断示例:--创建函数:通过DoctorID判断医生从医年限delimiter$$createfunctionfunc_if(Didchar(4))returnschar(20)readssqldatabeginselectworkingyearsinto@yearsfromDoctors;whereDoctorID=Did;if@years>=20thenreturn‘20年以上医龄’;elseif@years>=10thenreturn‘20年以上医龄’;elsereturn‘医龄还不到10年’;endif;end$$delimiter;函数解析1输入参数:Didchar(4)2返回值类型:char(20)3操作选项:readssqldata4查询医生工龄并存储到@years变量5使用IF-ELSEIF-ELSE进行多分支判断函数调用示例--调用函数查询医生d001的医龄mysql>SELECTfunc_if('d001');--查询结果SELECTDoctorID,workingyears,func_if(DoctorID)AS医龄评价FROMDoctors;5.2.1CASE语句两种语法格式CASE语句可实现多分支判断,其语法格式有两种,分别适用于不同的场景需求。理解两种格式的区别对于正确使用CASE语句至关重要。01格式一:CASE表达式CASE表达式WHENvalue1THEN语句块1;[WHENvalue2THEN语句块2;][ELSE语句块n;]ENDCASE;WHEN后面的value只能作单个值的判断适用于等值比较场景若所有WHEN都不匹配,则执行ELSE02格式二:CASE条件表达式CASEWHEN条件表达式1THEN语句块1;[WHEN条件表达式2THEN语句块2;][ELSE语句块n;]ENDCASE;CASE后面不需要写表达式WHEN后面可以是某个范围的判断适用于范围比较场景格式一适用场景:当需要根据某个表达式的具体值进行匹配时,如状态码、类型标识等离散值的判断。格式二适用场景:当需要进行范围判断或复杂条件组合时,如成绩评级、年龄段划分等连续范围判断。EXAMPLE5-3CASE语句实例:交通方向控制示例:--创建函数:模拟十字路口方向控制delimiter%%createfunctionfunc_cross(conditionint)returnschar(10)nosqlbegincaseconditionwhen-1thenreturnwhen0thenreturnwhen1thenreturnelsereturnendcase;end%%delimiter;函数解析1输入参数:conditionint2返回值类型:char(10)3操作选项:nosql4使用CASE格式一:等值比较5输入-1返回左转,0返回直行,1返回右转6其他值返回掉头函数调用示例--测试不同输入值mysql>SELECTfunc_cross(-1);|左转|mysql>SELECTfunc_cross(0);|直行|mysql>SELECTfunc_cross(2);|掉头|EXAMPLE5-4CASE语句实例:成绩等级判定示例:--创建函数:判断成绩等级delimiter//createfunctionfunc_level(scoreint)returnschar(10)nosqlbegincasewhenscore>=90thenreturn‘优秀’;whenscore>=80thenreturn‘良好’;whenscore>=70thenreturn‘中等’;whenscore>=60thenreturn‘及格’;elsereturn‘不及格’;endcase;end//delimiter;函数解析1输入参数:scoreint2返回值类型:char(10)3操作选项:nosql4使用CASE格式二:条件表达式5根据分数区间返回等级评价函数调用示例--测试不同分数mysql>SELECTfunc_level(95);|优秀|mysql>SELECTfunc_level(85);|良好|mysql>SELECTfunc_level(55);|不及格|5.2.2WHILE循环语句详解WHILE循环语法语法结构:[while_label:]WHILE条件表达式DO语句块;ENDWHILE[while_label];该语法结构属于当型循环,WHILE后面的条件表达式成立,则执行DO后的语句,最后用ENDWHILE结束循环。WHILE循环特点先判断条件,后执行循环体条件不成立时,循环体一次也不执行需要在循环体内更新条件变量func_sum函数:计算1到n的累加和--创建函数:计算1+2+...+n的结果delimiter//createfunctionfunc_sum(nint)returnsintnosqlbegindeclareiintdefault1;declaresintdefault0;whilei<=ndosets=s+i;seti=i+1;endwhile;returns;end//函数调用与执行过程--调用函数计算1到100的累加和mysql>SELECTfunc_sum(100);--执行过程分析:--1.初始化i=1,s=0--2.判断i(1)<=100,成立--3.执行s=0+1=1,i=1+1=2--4.重复步骤2-3直到i>100--最终结果:50505.2.2REPEAT循环语句详解REPEAT循环语法语法结构:[repeat_label:]REPEAT语句块;UNTIL条件表达式ENDREPEAT[repeat_label];REPEAT循环是一种直到型循环,先执行循环体,再判断条件,条件成立则退出循环。REPEAT循环特点先执行循环体,后判断条件条件成立时退出循环(与WHILE相反)循环体至少执行一次UNTIL后不需要使用";"结束func_sum2函数:计算0~100的偶数和--创建函数:计算0~100的偶数和delimiter&&createfunctionfunc_sum2()returnsintnosqlbegindeclareiintdefault0;declaresintdefault0;repeatifMOD(i,2)=0thensets=s+i;endif;seti=i+1;untili>100--此处不需要";"endrepeat;returns;end&&函数调用与执行过程--调用函数mysql>SELECTfunc_sum2();--执行过程分析:--1.初始化i=0,s=0--2.执行循环体(i=0,s=0+0=0)--3.判断i(0)>100?不成立--4.继续循环,直到i>100退出--最终结果:25505.2.2LOOP循环与LEAVE语句LOOP循环语法语法结构:[loop_label:]LOOP语句块;IF条件THENLEAVEloop_label;ENDIF;ENDLOOP[loop_label];LOOP循环属于一种直到型循环,需要结合IF语句和LEAVE关键词结束循环。LOOP循环特点需要显式使用LEAVE退出循环必须指定循环标签才能使用LEAVE灵活性高,可以控制任意位置退出func_fac函数:计算10的阶乘--创建函数:计算10的阶乘delimiter&&createfunctionfunc_fac()returnsintnosqlbegindeclarenintdefault1;declarepintdefault1;loop_begin:loopsetp=p*n;setn=n+1;ifn>10thenleaveloop_begin;endif;endlooploop_begin;returnp;end&&函数调用与执行过程--调用函数mysql>SELECTfunc_fac();--执行过程分析:--1.初始化n=1,p=1--2.p=1*1=1,n=1+1=2--3.判断n(2)>10?不成立--4.继续循环直到n=11时退出--最终结果:3628800EXAMPLE5-8ITERATE语句与循环控制示例:--创建函数:计算1~n的奇数和delimiter//createfunctiontest_iterate(nint)returnsintnosqlbegindeclareiintdefault1;declaresintdefault0;while_label:whilei<=ndoifMOD(i,2)<>0thensets=s+i;seti=i+1;elseseti=i+1;iteratewhile_label;endif;endwhile;returns;end//ITERATE语句说明编译程序中有关键词continue结束当前循环,MySQL中使用ITERATE实现相似功能。语法:ITERATEcycle_label;函数逻辑分析1遍历1到n的所有整数2判断i是否为奇数(MOD(i,2)<>0)3是奇数则累加到s,i自增4是偶数则i自增,使用ITERATE跳过ITERATE作用:跳过当前循环剩余语句,直接进入下一次循环判断。COMPARISON三种循环结构对比总结对比总结WHILE、REPEAT、LOOP三种循环的特点:WHILE是当型循环(先判断后执行),REPEAT是直到型循环(先执行后判断),LOOP需要配合LEAVE结束循环。说明各自的适用场景和语法要点。WHILE循环WHILE条件DO语句块;ENDWHILE;类型:当型循环执行顺序:先判断后执行最少执行:0次适用场景:不确定循环次数REPEAT循环REPEAT语句块;UNTIL条件ENDREPEAT;类型:直到型循环执行顺序:先执行后判断最少执行:1次适用场景:需要先执行后判断LOOP循环loop_label:LOOP语句块;IF条件THENLEAVEloop_label;ENDIF;ENDLOOP;类型:直到型循环退出方式:LEAVE语句最少执行:1次适用场景:需要灵活控制退出选择建议:根据具体需求选择合适的循环结构。如果条件明确且需要先判断,使用WHILE;如果需要至少执行一次,使用REPEAT;如果需要灵活控制退出点,使用LOOP+LEAVE。03存储过程035.3OVERVIEW存储过程的核心概念什么是存储过程存储过程是一种模块化程序设计,由一组可以完成复杂操作的过程性SQL语句组成,其存储在数据库系统中,可按需调用执行。核心特征:存储在数据库服务器端可包含多条SQL语句支持过程化编程特性存储过程的优势1提高性能:预编译,减少网络传输2增强安全性:权限控制,防止SQL注入3提高可维护性:代码复用,逻辑封装4简化开发:封装复杂业务逻辑参数传递机制存储过程可带形参,允许用户输入或返回多个参数,从而实现特定的逻辑功能。参数类型:IN-输入参数OUT-输出参数INOUT-输入输出参数存储过程与函数的区别存储过程可以有0个或多个返回值,适合复杂业务逻辑自定义函数必须有1个返回值,适合计算型功能存储过程通过CALL命令调用,而函数通过SELECT命令调用5.3.1存储过程创建语法全解析CREATEPROCEDURE语法CREATEPROCEDUREproc_name([proc_parameter[,...]])[characteristic]routine_body01proc_name存储过程名存储过程的名称,需满足标识符命名规范,不能与系统中关键词和函数名冲突。02proc_parameter形参可以包含传进和返回的参数,其格式为:[IN|OUT|INOUT]parameter_nametype03characteristic操作选项MySQL8.0以上版本对数据库数据安全更加严格,要求必须包含该项操作说明。LANGUAGESQL[NOT]DETERMINISTIC{CONTAINSSQL|NOSQL}SQLSECURITYCHARACTERISTICCharacteristic选项详解01LANGUAGESQL表示创建该存储过程的语言为SQL,这是默认选项,通常无需显式指定。02[NOT]DETERMINISTIC表示存储过程输入相同的参数是否产生相同结果。DETERMINISTIC-结果确定NOTDETERMINISTIC-结果不确定(默认)03SQL读写操作说明CONTAINSSQL包含SQL语句(默认)NOSQL不包含SQL语句READSSQLDATA只读取数据MODIFIESSQLDATA修改数据(需设置信任参数)04SQLSECURITY安全性说明指定存储过程按照谁的权限来执行:DEFINER(默认)按照创建者的权限执行INVOKER按照调用者的权限执行选项选择建议1只查询数据→READSSQLDATA2修改数据→MODIFIESSQLDATA3只有逻辑计算→NOSQL4需要严格控制权限→INVOKERSECURITYCONFIG二进制日志信任参数设置安全设置的重要性当characteristic值为MODIFIESSQLDATA时,创建存储过程或函数之前需设置系统二进制日志信任参数,该参数为@@GLOBAL.log_bin_trust_function_creators。这是因为MySQL8.0以上版本对数据库数据安全更加严格,默认情况下不允许普通用户创建可能修改数据的存储程序。查询系统参数默认状态mysql>SELECT@@GLOBAL.log_bin_trust_function_creators;+------------------------------------------+|@@GLOBAL.log_bin_trust_function_creators|+------------------------------------------+|0|+------------------------------------------+--默认值为0,表示不信任设置信任参数--设置信任参数为1SET@@GLOBAL.log_bin_trust_function_creators=1;--或者使用全局设置SETGLOBALlog_bin_trust_function_creators=1;参数说明•0-不信任,默认设置•1-信任,允许创建•需要在创建前设置注意事项•需要SUPER权限才能设置•设置后立即生效•重启MySQL后需重新设置EXAMPLE5-10存储过程实例:输出公民道德规范示例:--创建存储过程:输出公民基本道德规范delimiter//createprocedureproc_info()nosqlbeginselectas公民基本道德公约;end//delimiter;过程解析1过程名:proc_info2无参数:空的参数列表()3操作选项:nosql4过程体:SELECT语句返回字符串过程调用--调用存储过程mysql>CALLproc_info();--执行结果+----------------------------------------------+|公民基本道德公约|+----------------------------------------------+|爱国守法,明礼诚信,团结友善,勤俭自强,敬业奉献|+----------------------------------------------+EXAMPLE5-11存储过程实例:查询学生成绩等级示例:--创建存储过程:输入学号、课程号,返回成绩信息delimiter//createprocedureproc_getLevel(instudentnochar(6),incoursenochar(6))readssqldatabeginselectsno,cno,grade,if(grade>=90,if(grade>=80,if(grade>=70,if(grade>=60,'不合格'))))as成绩等级fromscorewheresno=studentnoandcno=courseno;end//过程解析1过程名:proc_getLevel2输入参数:INstudentno,INcourseno3操作选项:readssqldata4嵌套IF实现成绩等级判定过程调用--调用过程查询学号250101,课程c01的成绩mysql>CALLproc_getLevel('250101','c01');--执行结果示例+----------+-------+-------+----------+|sno|cno|grade|成绩等级|+----------+-------+-------+----------+|250101|c01|92|优|+----------+-------+-------+----------+5.3.2存储过程的调用方法CALL命令语法CALL[db_name.]proc_name([parameter1,parameter2,...])调用存储过程使用CALL命令,可以指定数据库名和参数列表。调用示例调用无参数过程CALLproc_info();调用有参数过程CALLproc_getLevel('250101','c01');调用proc_info示例mysql>CALLproc_info();--执行结果+----------------------------------------------+|公民基本道德公约|+----------------------------------------------+|爱国守法,明礼诚信,团结友善,勤俭自强,敬业奉献|+----------------------------------------------+调用proc_getLevel示例mysql>CALLproc_getLevel('250101','c01');--执行结果+----------+-------+-------+----------+|sno|cno|grade|成绩等级|+----------+-------+-------+----------+|250101|c01|92|优|+----------+-------+-------+----------+调用要点•参数个数和类型必须与定义匹配•OUT参数需要使用变量接收•可以使用@用户变量传递参数5.3.2存储过程的修改方式修改存储过程有两种方式:一是在MySQLWorkbench8.0界面上右键修改,二是通过ALTERPROCEDURE命令修改。不同方式各有优劣,需要根据具体需求选择合适的方法。01Workbench界面修改在MySQLWorkbench8.0界面上,找到对象管理面板,对指定创建的存储过程右键选择"AlterStoredProcedure...",界面上即弹出该存储过程的程序修改界面。操作步骤:1打开对象管理面板2右键选择存储过程3点击"AlterStoredProcedure"4修改代码后Apply提交02ALTERPROCEDURE命令ALTERPROCEDUREproc_name[characteristic]版本要求MySQL8.0.16之后版本才支持ALTERPROCEDURE命令修改存储过程,使用该命令请确保有较高的版本支持和足够的权限。功能限制修改存储过程的参数列表(增加或删除参数)时,ALTERPROCEDURE命令不支持。这时需要删除原存储过程,重新创建一个新的存储过程。最佳实践:建议使用Workbench界面修改方式,既可以修改参数列表、操作选项,也可以修改存储过程体,操作更加直观便捷,且不受版本限制。5.3.2存储过程的删除操作删除方式删除存储过程可以使用Workbench工具界面或SQL命令两种方式。Workbench方式在对象管理面板处,找到对应存储过程,右键DropStoredProcedure...SQL命令方式使用DROPPROCEDURE命令删除删除语法DROPPROCEDURE[IFEXISTS]proc_name;IFEXISTS选项可以避免删除不存在的存储过程时报错删除示例--删除proc_info存储过程mysql>DROPPROCEDUREproc_info;--执行结果QueryOK,0rowsaffected(0.00sec)使用IFEXISTS--安全删除(不报错)mysql>DROPPROCEDUREIFEXISTSproc_info;注意事项•删除前确保过程不再被使用•删除后无法恢复,谨慎操作•建议先备份过程定义MANAGEMENTSUMMARY存储过程管理操作总结总结存储过程的核心管理操作:调用(CALL)、修改(ALTERPROCEDURE或界面操作)、删除(DROPPROCEDURE)。强调不同操作的使用场景和注意事项,特别是版本要求和权限问题。调用操作CALLproc_name([parameters]);参数个数类型需匹配OUT参数需用变量接收修改操作ALTERPROCEDUREproc_name[characteristic];MySQL8.0.16+支持界面方式更灵活删除操作DROPPROCEDURE[IFEXISTS]proc_name;IFEXISTS避免报错删除后无法恢复版本要求:MySQL8.0.16+版本支持ALTERPROCEDURE命令,低版本需使用Workbench界面或删除重建方式权限要求:需要ALTERROUTINE权限才能修改,需要CREATEROUTINE权限才能创建04自定义函数045.4OVERVIEW自定义函数的核心概念什么是自定义函数用户自定义函数作为模块化程序设计的体现,在函数体中结合相关控制流语句,可实现用户所需要的功能。核心特征:必须有返回值只能有输入参数通过SELECT调用MySQL8.0+使用规则MySQL8.0以上版本认为自定义函数的创建者必须为可信任的,因此需要授予普通用户GRANTROUTINE权限。授权方法:GRANTCREATEROUTINEON*.*TO'username'@'host';函数与存储过程对比参数类型函数:只有输入参数存储过程:IN/OUT/INOUT返回值函数:必须有返回值存储过程:可以没有调用方式函数:SELECT调用存储过程:CALL调用函数应用场景数据计算和转换复杂业务规则封装数据验证和处理在SQL语句中直接使用5.4.1自定义函数创建语法全解析CREATEFUNCTION语法CREATEFUNCTIONfunc_name([func_parameter[,...]])RETURNSdata_type[characteristic]routine_body01func_name函数名存储过程名,需满足标识符命名规范,不能与系统中关键词和函数名冲突。02func_parameter形参函数参数,格式为parameter_nametype,不需要指定IN/OUT/INOUT类型。parameter_nametype03RETURNSdata_type指定函数的返回值类型,这是函数定义必须的组成部分。04characteristic&routine_bodycharacteristic选项与存储过程相同,routine_body表示函数体,如包含多条SQL语句,需用begin...end描述。函数体中必须有RETURN语句返回值。COMPARISON函数与存储过程的语法差异对比函数和存储过程的关键差异:函数必须有RETURNS指定返回类型,参数无需IN/OUT/INOUT,调用使用SELECT而非CALL,函数体必须有RETURN语句返回值。说明两者在设计理念和使用场景上的不同。函数特点创建语法CREATEFUNCTIONname()RETURNStype...RETURNvalue;参数只有输入参数,无需指定IN/OUT调用方式SELECTfunc_name();存储过程特点创建语法CREATEPROCEDUREname()[parameters]...--可以有RETURN,也可以没有参数支持IN、OUT、INOUT三种类型调用方式CALLproc_name();设计理念:函数主要用于计算和数据处理,强调返回值;存储过程主要用于执行业务逻辑,强调过程执行。根据具体需求选择合适的数据库对象。EXAMPLE5-14自定义函数实例:查询病人预约信息示例:--创建函数:输入病人ID查询预约信息delimiter//createfunctionfunc_getAppointmentInfo(PIDchar(4))returnschar(50)readssqldatabeginselectPatientNameinto@pNamefromPatientswherePatientID=PID;selectDoctorNameinto@dNamefromDoctorswhereDoctorID=(selectDoctorIDfromAppointmentswherePatientID=PID);selectconcat(AppointmentDate,into@dtfromAppointmentswherePatientID=PID;returnconcat(@pName,'',@dt);end//函数解析1输入参数:PIDchar(4)2返回值类型:char(50)3操作选项:readssqldata4多表查询:Patients、Doctors、Appointments5使用concat拼接返回结果函数调用--调用函数查询病人p001的预约信息mysql>SELECTfunc_getAppointmentInfo('p001')--执行结果+--------------------------------------------+|病人医生预约时间|+--------------------------------------------+|张文文张浩2025-10-0510:30:00|+--------------------------------------------+EXAMPLE5-15自定义函数实例:修改预约时间示例:--创建函数:修改预约时间delimiter//createfunctionfunc_updateInfo(PIDchar(4),aptDateDate,aptTimeTime)returnsintmodifiessqldatabeginupdateAppointmentssetAppointmentDate=aptDate,appointmentTime=aptTimewherePatientID=PID;return0;end//函数解析1输入参数:PID,aptDate,aptTime2返回值类型:int(固定返回0)3操作选项:modifiessqldata4UPDATE语句修改预约时间函数调用--调用函数修改预约时间mysql>SELECTfunc_updateInfo('p001','2025-10-5','10:30:00');--查询修改后的结果mysql>SELECT*FROMappointments;+---------------+-----------+-----------+-------------+---------------------+-------------------+|AppointmentID|PatientID|DoctorID|PCondition|AppointmentDate|AppointmentTime|+---------------+-----------+-----------+-------------+--------------------+-------------------+|1|p001|d002|小儿感冒|2025-10-05|10:30:00|+---------------+-----------+-----------+-------------+--------------------+-------------------+5.4.2自定义函数的调用方法SELECT命令语法SELECT[db_name.]func_name([parameter1,parameter2,...]);调用函数使用SELECT命令,可以指定数据库名和参数列表,函数返回值作为查询结果返回。调用示例调用无参数函数SELECTfunc_sum2();调用有参数函数SELECTfunc_getAppointmentInfo('p001');指定别名SELECTfunc_if('d001')AS医龄评价;调用func_getAppointmentInfomysql>SELECTfunc_getAppointmentInfo('p001')--执行结果+--------------------------------------------+|病人医生预约时间|+--------------------------------------------+|张文文张浩2025-10-0510:30:00|+--------------------------------------------+调用func_if函数mysql>SELECTfunc_if('d001')AS医龄评价;--执行结果+-------------------+|医龄评价|+-------------------+|20年以上医龄|+-------------------+调用要点•参数个数和类型必须与定义匹配•可以在SQL语句中嵌套调用•可以使用别名美化输出5.4.2查看函数状态信息介绍两种查看函数状态的方法:一是SHOWFUNCTIONSTATUS查看数据库中所有自定义函数的基本信息(Name、Type、Definer等);二是SHOWCREATEFUNCTION查看指定函数的完整创建语句和字符集信息。SHOWFUNCTIONSTATUSmysql>SHOWFUNCTIONSTATUSWHEREdb='mms';--查询结果(部分字段)+------+--------------------------+---------+|Db|Name|Type|+------+--------------------------+---------+|mms|func_fac|FUNCTION||mms|func_getAppointmentInfo|FUNCTION||mms|func_updateInfo|FUNCTION|+------+--------------------------+---------+SHOWCREATEFUNCTIONmysql>SHOWCREATEFUNCTIONfunc_updateInfo;--查询结果(部分字段)+----------------+--------------------------------+|Function|CreateFunction|+----------------+--------------------------------+CREATEDEFINER=`root`@`localhost`FUNCTION`func_updateInfo`(...)RETURNSintMODIFIESSQLDATABEGIN...END+----------------+--------------------------------+STATUS用途:查看数据库中所有函数的基本信息,包括创建者、创建时间、修改时间等元数据CREATE用途:查看函数的完整创建语句,便于备份、迁移和调试5.4.2函数的修改与删除操作函数修改ALTERFUNCTIONfunc_name[characteristic];函数的修改规则与存储过程相似,可以通过Workbench界面或ALTERFUNCTION命令修改。推荐方式通过workbench界面对象管理面板右键AlterFunction...进行修改后apply提交修改限制不能修改参数列表不能修改返回类型可以修改characteristic选项函数删除DROPFUNCTION[IFEXISTS]func_name;函数的删除有两种方式:使
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 罕见肿瘤的精准医疗与个体化治疗
- 预算评审质量控制制度
- 2026年咸阳市高新一中教师招聘备考题库及答案详解(考点梳理)
- 罕见肿瘤的个体化治疗治疗策略优化经验与推广
- 2025年建筑施工企业收发文管理制度
- 出纳与财务制度
- 非税收入财务制度
- 养猪小规模企业财务制度
- 餐厅收银财务制度
- 地产项目财务制度
- 2025至2030中国EB病毒检测行业标准制定与市场规范化发展报告
- 2026中国电信四川公用信息产业有限责任公司社会成熟人才招聘备考题库及答案详解1套
- 2026年浙江高考语文真题试卷+答案
- 2025 年大学人工智能(AI 应用)期中测试卷
- 《市场营销(第四版)》中职完整全套教学课件
- (正式版)DB61∕T 2121-2025 《风力发电场集电线路设计规范》
- 疑难病例讨论制度落实常见问题与改进建议
- 创伤性脾破裂的护理
- 蓬深102井钻井工程(重新报批)项目环境影响报告表
- 大模型金融领域可信应用参考框架
- (新教材)2025年人教版七年级上册历史期末复习常考知识点梳理复习提纲(教师版)
评论
0/150
提交评论