存储过程
存储过程如同一门程序设计语言,同样包含了数据类型、流程控制、输入和输出和它自己的函数库。
存储过程优点
存储过程增强了SQL语言的功能和灵活性。利用控制语句组合SQL语句,可以实现较为复杂的逻辑和计算。
存储过程允许标准组件是编程。创建后可以被重复调用,类似方法。
存储过程能实现较快的执行速度。存储过程是预编译的,在首次执行时优化器会对其进行分析优化,并给出存储在系统表中的执行计划,而批处理transaction-SQL语句块在执行时都要进行编译和优化,因此存储过程速度比批处理快。
存储过程能过减少网络流量。
存储过程可被作为一种安全机制来充分利用。通过对执行存储过程权限进行限制来实现安全性。
基本语法
创建存储过程:
DELIMITER
CREATE PROCEDURE seq_no()
begin
DECLARE v_cnt int;
DECLARE v_timestr int;
DECLARE rowcount bigint;
set v_timestr = DATE_FORMAT(NOW(),’%Y%m%d’);
end
DELIMITER;调用存储过程:
call seq_no()
删除存储过程:
drop procedure seq_no;
不能再一个存储构成删除另一个存储过程,只能调用另一个存储过程。显示存储过程的基本信息:
查看所有存储过程所在的库,创建日期,修改日期,编码格式等。
show procedure status;
查看存储过程的创建代码
show create procedure sp_name;查看MYSQL中的存储过程:
1.select name from mysql.proc where db=’数据库名’;
2.select routine_name from information_schema.routines where routine_schema=’数据库名’;
3.show procedure status where db=’数据库名’;修改存储过程
只需将创建时的create变为alter,添加修改的内容即可。
存储过程参数定义:
MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT
形式如:CREATE PROCEDURE SP_demo([[IN |OUT |INOUT ] 参数名 数据类形…])
数据类型及运算符
变量定义及赋值
变量分为系统变量和用户变量,系统变量会话和全局级变量。
MySQL数据类型:int, number,float, date, varchar(length)定义: DECLARE variable_name[,variable_name] 数据类型 [defalut_value]
赋值:set variable_name = value;
例如
DECLARE v_count int;
DECLARE v_num mumber(8,2) DEFAULT 10.02;
DECLARE v_date date DEFAULT ‘1999-12-31’;
DECLARE v_str varchar(10);
set v_count = 10;
set v_str = “hello world”;
用户变量定义:一般都以@开头,不需定义,直接用下列两种方法赋值即可。
例如
mysql >select “hello world” into @v_str;
mysql >select @v_str;mysql >set @v_num=1+2+3;
mysql >select @v_num;
运算符
算术运算符
加(+)、减(-)、乘(*)、除(/)、取整(div)、取模(%)
set var1 = 10 div 3; 3
set var2 = 10 % 3; 1比较运算符
大于 1>2 False
小于 2<1 False
小于等于 2<=2 True
大于等于 3>=2 True
在两值之间 5 BETWEEN 1 AND 10 True
不在两值之间 5 NOT BETWEEN 1 AND 10 False
在集合中 5 IN (1,2,3,4) False
不在集合中 5 NOT IN (1,2,3,4) True
等于 2=3 False
不等于 2<>3 2 !=3 True
严格比较两个NULL值是否相等 NULL<=>NULL True
简单模式匹配 “Guy Harrison” LIKE “Guy%” True
正则式匹配 “Guy Harrison” REGEXP “[Gg]reg” False
为空 0 IS NULL False
不为空 0 IS NOT NULL True位运算符
或( | )、与(&)、左移位(<<)、右移位(>>)、非(~)(单目运算,按位取反)
MySQL存储过程的控制语句
条件语句
- if-then -else语句
mysql > delimiter // mysql > CREATE PROCEDURE sp_demo(IN param int) -> begin -> declare var int; -> set var=param+1; -> if var=0 then -> insert into t values(10); -> end if; -> if param=0 then -> update t set s1=s1+1; -> else -> update t set s1=s1+2; -> end if; -> end; -> // mysql > delimiter ;
- case语句
mysql > DELIMITER // mysql > CREATE PROCEDURE sp_demo (IN param int) -> begin -> declare var int; -> set var = param+1; -> case var -> when 0 then -> insert into t values(0); -> when 1 then -> insert into t values(1); -> else -> insert into t values(2); -> end case; -> end; -> // mysql > DELIMITER ;
循环结构
while语句
mysql > DELIMITER // mysql > CREATE PROCEDURE sp_demo() -> begin -> declare var int default 0; -> while var<2 do -> insert into t values(var); -> set var=var+1; -> end while; -> end; -> // mysql > DELIMITER ;
repeat语句
需要注意的是,repeat和until语句后没有分号。
mysql > DELIMITER // mysql > CREATE PROCEDURE sp_demo () -> begin -> declare var int default 0; -> repeat -> insert into t values(v); -> set var = var + 1; -> until var >= 2 -> end repeat; -> end; -> // mysql > DELIMITER ;
loop语句
leave语句的意义是离开循环。
mysql > DELIMITER // mysql > CREATE PROCEDURE proc6 () -> begin -> declare var int default 0; -> LOOP_LABLE:loop -> insert into t values(var); -> set var=var+1; -> if var >=5 then -> leave LOOP_LABLE; -> end if; -> end loop; -> end; -> // mysql > DELIMITER ;
附:函数库
mysql存储过程基本函数包括:字符串类型,数值类型,日期类型
一、字符串类
CHARSET(str) //返回字串字符集
CONCAT (string2 [,… ]) //连接字串
INSTR (string ,substring ) //返回substring首次在string中出现的位置,不存在返回0
LCASE (string2 ) //转换成小写
LEFT (string2 ,length ) //从string2中的左边起取length个字符
LENGTH (string ) //string长度
LOAD_FILE (file_name ) //从文件读取内容
LOCATE (substring , string [,start_position ] ) 同INSTR,但可指定开始位置
LPAD (string2 ,length ,pad ) //重复用pad加在string开头,直到字串长度为length
LTRIM (string2 ) //去除前端空格
REPEAT (string2 ,count ) //重复count次
REPLACE (str ,search_str ,replace_str ) //在str中用replace_str替换search_str
RPAD (string2 ,length ,pad) //在str后用pad补充,直到长度为length
RTRIM (string2 ) //去除后端空格
STRCMP (string1 ,string2 ) //逐字符比较两字串大小,
SUBSTRING (str , position [,length ]) //从str的position开始,取length个字符,position第一个字符默认为1
TRIM([[BOTH|LEADING|TRAILING] [padding] FROM]string2) //去除指定位置的指定字符
UCASE (string2 ) //转换成大写
RIGHT(string2,length) //取string2最后length个字符
SPACE(count) //生成count个空格
二、数值类型
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)返回19
LEAST (number , number2 [,..]) //求最小值
MOD (numerator ,denominator ) //求余
POWER (number ,power ) //求指数
RAND([seed]) //随机数
ROUND (number [,decimals ]) //四舍五入,decimals为返回的小数位数,返回类型并非均为整数
SIGN (number2 ) //返回符号,正负或0
SQRT(number2) //开平方
三、日期类型
ADDTIME (date2 ,time_interval ) //将time_interval加到date2
CONVERT_TZ (datetime2 ,fromTZ ,toTZ ) //转换时区
CURRENT_DATE ( ) //当前日期
CURRENT_TIME ( ) //当前时间
CURRENT_TIMESTAMP ( ) //当前时间戳
DATE (datetime ) //返回datetime的日期部分
DATE_ADD (date2 , INTERVAL d_value d_type ) //在date2中加上日期或时间
DATE_FORMAT (datetime ,FormatCodes ) //使用formatcodes格式显示datetime
DATE_SUB (date2 , INTERVAL d_value d_type ) //在date2上减去一个时间
DATEDIFF (date1 ,date2 ) //两个日期差
DAY (date ) //返回日期的天
DAYNAME (date ) //英文星期
DAYOFWEEK (date ) //星期(1-7) ,1为星期天
DAYOFYEAR (date ) //一年中的第几天
EXTRACT (interval_name FROM date ) //从date中提取日期的指定部分
MAKEDATE (year ,day ) //给出年及年中的第几天,生成日期串
MAKETIME (hour ,minute ,second ) //生成时间串
MONTHNAME (date ) //英文月份名
NOW ( ) //当前时间
SEC_TO_TIME (seconds ) //秒数转成时间
STR_TO_DATE (string ,format ) //字串转成时间,以format格式显示
TIMEDIFF (datetime1 ,datetime2 ) //两个时间差
TIME_TO_SEC (time ) //时间转秒数]
WEEK (date_time [,start_of_week ]) //第几周
YEAR (datetime ) //年份
DAYOFMONTH(datetime) //月的第几天
HOUR(datetime) //小时
LAST_DAY(date) //date的月的最后日期
MICROSECOND(datetime) //微秒
MONTH(datetime) //月
MINUTE(datetime) //分
注:可用在INTERVAL中的类型:DAY ,DAY_HOUR ,DAY_MINUTE ,DAY_SECOND ,HOUR ,HOUR_MINUTE ,HOUR_SECOND ,MINUTE ,MINUTE_SECOND,MONTH ,SECOND ,YEAR