当前位置: 首页 > 科技观察

关于MySQL的存储过程语法和例子

时间:2023-03-23 09:51:44 科技观察

存储过程就像一门编程语言,它也包括数据类型、过程控制、输入输出,还有它自己的函数库。------------------基本语法--------------------1.创建存储过程createproceduresp_name()begin.........end2.调用存储过程1.基本语法:callsp_name()注意:存储过程名后必须加括号,即使存储过程没有传递参数3.删除存储过程1.基本语法:dropproceduresp_name;二、注意事项(1)不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程四、其他常用命令1、showprocedurestatus显示数据库中所有存储过程的基本信息,包括数据库、存储过程名称、创建时间等2.showcreateproceduresp_name显示某个MySQL存储过程的详细信息--------------------数据类型和操作符号--------------------1.基本数据类型:略2.变量:自定义变量:DECLAREaINT;设置一个=100;可以用下面的语句代替:DECLAREaINTDEFAULT100;变量分为用户变量和系统变量,系统变量分为会话变量和全局变量。用户变量:用户变量名一般以@开头,滥用用户变量会使程序难以理解和管理。1.在mysql客户端使用用户变量mysql>SELECT'HelloWorld'into@x;mysql>SELECT@x;mysql>SET@y='GoodbyeCruelWorld';mysql>select@y;mysql>SET@z=1+2+3;mysql>选择@z;2。在存储过程中使用用户变量mysql>CREATEPROCEDUREGreetWorld()SELECTCONCAT(@greeting,'World');mysql>SET@greeting='Hello';mysql>CALLGreetWorld();3。在存储过程mysql>CREATEPROCEDUREp1()SET@last_procedure='p1';mysql>CREATEPROCEDUREp2()SELECTCONCAT('Lastprocedure是',@last_procedure);mysql>CALLp1();mysql>CALLp2();3。运算符:1.算术运算符+plusSETvar1=2+2;4-减去SETvar2=3-2;1*乘法SETvar3=3*2;6/除法SETvar4=10/3;3.3333DIV整数除法SETvar5=10DIV3;3%模数SETvar6=10%3;12、比较运算符>大于1>2假<小于2<1假<=小于等于2<=2真>=大于等于3>=2TrueBETWEEN两个值之间5BETWEEN1AND10TrueNOTBETWEEN不在两个值之间5NOTBETWEEN1AND10FalseINinsetIn5IN(1,2,3,4)FalseNOTINNotinset5NOTIN(1,2,3,4)True=equalto2=3False<>,!=不等于2<>3False<=>严格比较两个NULL值是否相等NULL<=>NULLTrueLIKE简单模式匹配"GuyHarrison"LIKE"Guy%"TrueREGEXP正则表达式匹配"GuyHarrison"REGEXP"[Gg]reg"FalseISNULL为空0ISNULLFalseISNOTNULL不为空0ISNOTNULLTrue3.逻辑运算符4.位运算符|or&and<>rightshift~not(单目运算,按位取反)注:mysql存储过程可以使用两种风格的双横杠:--这种风格一般用于单行注释c-style:/*注释内容*/一般用于多行注释---------------------流程控制--------------------1.序列结构2.分支结构ifcase3.循环结构forloopwhilelooplooplooprepeatuntilcycle注:块定义,常用begin……end;也可以给block起一个别名,比如:lable:begin............endlable;你可以使用leave标签;跳出block执行block之后的代码begin和end就像C语言中的{and}------------------输入输出--------------------mysql存储过程的参数在存储过程的定义中使用了三种参数类型,IN,OUT,INOUTCreateprocedure|function([[IN|OUT|INOUT]parameternamedatatype...])INinputparameter表示参数必须存储在调用过程中指定,存储过程中修改的参数值不能返回。它是OUT输出参数的默认值。该值可以在存储过程中更改并返回。INOUT在调用输入输出参数时指定,可以更改和返回。IN参数示例:CREATEPROCEDUREsp_demo_in_parameter(INp_inINT)BEGINSELECTp_in;--查询输入参数SETp_in=2;--修改selectp_in;--查看修改后的值END;执行结果:mysql>set@p_in=1mysql>callsp_demo_in_parameter(@p_in)mysql>select@p_in;从上面可以看出,虽然在存储过程中修改了p_in,但是并不影响@p_id的值OUT参数创建示例:mysql>CREATEPROCEDUREsp_demo_out_parameter(OUTp_outINT)BEGINSELECTp_out;/*查看输出参数*/SETp_out=2;/*修改参数值*/SELECTp_out;/*查看是否有变化*/END;执行结果:mysql>SET@p_out=1mysql>CALLsp_demo_out_parameter(@p_out)mysql>SELECT@p_out;INOUT参数示例:mysql>CREATEPROCEDUREsp_demo_inout_parameter(INOUTp_inoutINT)BEGINSELECTp_inout;SETp_inout=2;SELECTp_inout;END;执行结果:set@p_inout=1callsp_demo_inout_parameter(@p_inout)//select@p_inout;类型,数值类型,日期类型1,字符串类CHARSET(str)//返回字符串字符集CONCAT(string2[,...])//连接字符串INSTR(string,substring)//返回子字符串在字符串中第一次出现的位置,不存在则返回0LCASE(string2)//转换为小写LEFT(string2,length)//从string2左边取length个字符LENGTH(string)//字符串长度LOAD_FILE(file_name)//从文件中读取内容LOCATE(substring,string[,start_position])同INSTR,但可以指定起始位置LPAD(string2,length,pad)//重复在字符串开头添加pad,直到字符串长度为lengthLTRIM(string2)//去掉前面的空格REPEAT(string2,count)//重复count次REPLACE(str,search_str,replace_str)//将str中的search_str替换为replace_strRPAD(string2,length,pad)//在str之后添加pad直到长度为lengthRTRIM(string2)//去除后端空格STRCMP(string1,string2)//比较两个字符串的大小characterbycharacter,SUBSTRING(str,position[,length])//从str的位置开始,取length个字符,注意:在mysql中处理字符串时,默认第一个字符下标为1,即参数位置必须大于等于1mysql>selectsubstring('abcd',0,2);+————————+|substring('abcd',0,2)|+————————–+||+—————————+1rowinset(0.00sec)mysql>selectsubstring('abcd',1,2);+————————+|substring('abcd',1,2)|+————————–+|ab|+————————+1rowinset(0.02sec)TRIM([[BOTH|LEADING|TRAILING][padding]FROM]string2)//去掉指定字符处指定位置UCASE(string2)//转为大写RIGHT(string2,length)//取string2的最后一个length字符SPACE(count)//生成count个空格2.值类型ABS(number2)//绝对值BIN(decimal_number)//十进制转二进制CEILING(number2)//向上取整CONV(number2,from_base,to_base)//十进制转换FLOOR(number2)//向下取整FORMAT(number,decimal_places)//保留小数位数HEX(DecimalNumber)//转为十六进制:可以将一个字符串传入HEX(),返回其ASC-11码,如HEX('DEF')返回4142143,也可以传入一个十进制整数,其十六进制值将被返回编码,如HEX(25)返回19LEAST(number,number2[,..])//求最小值MOD(numerator,denominator)//求余数POWER(number,power)//求指数RAND([seed])//随机数ROUND(number[,decimals])//四舍五入,decimals为小数位数]注意:返回类型不全是整数,如:(1)默认为整数值mysql>selectround(1.23);+————-+|round(1.23)|+————+|1|+——————+1rowinset(0.00sec)mysql>selectround(1.56);+————+|round(1.56)|+——————+|2|+——————+1rowinset(0.00sec)(2)可以设置小数位数,返回浮点型数据mysql>selectround(1.567,2);+——————+|round(1.567,2)|+————————-+|1.57|+——————+1rowinset(0.00sec)SIGN(number2)//返回正负号或0SQRT(number2)//平方提取3.日期类型ADDTIME(date2,time_interval)//添加time_interval到date2CONVERT_TZ(datetime2,fromTZ,toTZ)//转换时区CURRENT_DATE()//当前日期CURRENT_TIME()//当前时间CURRENT_TIMESTAMP()//当前时间戳DATE(datetime)//返回日期partofdatetimeDATE_ADD(date2,INTERVALd_valued_type)//将日期或时间添加到date2DATE_FORMAT(datetime,FormatCodes)//使用格式代码显示datetimeDATE_SUB(date2,INTERVALd_valued_type)//从date2中减去一个时间DATEDIFF(date1,date2)//两个日期之间的差DAY(date)//返回日期的日期DAYNAME(date)//英文星期DAYOFWEEK(date)//week(1-7),1是星期天DAYOFYEAR(date)//年的第一天EXTRACT(interval_nameFROMdate)//从date中提取日期的指定部分MAKEDATE(year,day)//给出年和中间的日期year第一天,生成日期字符串MAKETIME(hour,minute,second)//生成时间字符串MONTHNAME(date)//英文月份名称NOW()//当前时间SEC_TO_TIME(seconds)//秒转换totimeSTR_TO_DATE(string,format)//将字符串转换成时间格式显示TIMEDIFF(datetime1,datetime2)//两个时间差TIME_TO_SEC(time)//时间转秒]WEEK(date_time[,start_of_week])//周数是多少YEAR(datetime)//年DAYOFMONTH(datetime)//该月的第一天HOUR(datetime)//小时LAST_DAY(date)//该月的最后一天ofdateMICROSECOND(datetime)//微秒MONTH(datetime)//月MINUTE(datetime)//注意:INTERVAL中可用的类型:DAY,DAY_HOUR,DAY_MINUTE,DAY_SECOND,HOUR,HOUR_MINUTE,HOUR_SECOND,MINUTE,MINUTE_SECOND,MONTH,SECOND,YEARDECLARE变量名[,变量名...]数据类型[默认值];其中datatype为mysql的数据类型,如:INT、FLOAT、DATE、VARCHAR(length)例:DECLAREl_intINTunsigneddefault4000000;DECLAREl_numericNUMERIC(8,2)DEFAULT9.95;DECLAREl_dateDATEDEFAULT'1999-12-31';DECLAREl_datetimeDATETIMEDEFAULT'1999-12-3123:59:59';DECLAREl_varcharVARCHAR(255)DEFAULT'Thiswillnotbepadded';

最新推荐
猜你喜欢