mysql 存储过程 应用_【MySQL】mysql 存储过程应用

存储过程

存储过程如同一门程序设计语言,同样包含了数据类型、流程控制、输入和输出和它自己的函数库。

存储过程优点

存储过程增强了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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL 存储过程是一种预先编译好的 SQL 代码块,可以通过单个调用执行多个 SQL 语句存储过程可以接收参数,可以使用条件、循环等语句实现复杂的业务逻辑。下面是 MySQL 存储过程的基本用法: 1. 创建存储过程 使用 CREATE PROCEDURE 语句创建存储过程,语法如下: ``` CREATE PROCEDURE procedure_name ([IN|OUT|INOUT] parameter_name data_type) BEGIN -- 存储过程的 SQL 语句 END; ``` 其,procedure_name 为存储过程名,parameter_name 为参数名,data_type 为参数数据类型,可以是 MySQL 支持的任何数据类型。 2. 执行存储过程 使用 CALL 语句执行存储过程,语法如下: ``` CALL procedure_name(parameter_value); ``` 其,procedure_name 为存储过程名,parameter_value 为参数值,可以是一个常量、变量或表达式。 3. 删除存储过程 使用 DROP PROCEDURE 语句删除存储过程,语法如下: ``` DROP PROCEDURE procedure_name; ``` 其,procedure_name 为存储过程名。 4. 示例 下面是一个简单的 MySQL 存储过程示例,实现了对用户表的插入操作: ``` CREATE PROCEDURE insert_user(IN name VARCHAR(50), IN age INT, IN gender VARCHAR(10)) BEGIN INSERT INTO user(name, age, gender) VALUES(name, age, gender); END; CALL insert_user('张三', 20, '男'); ``` 该存储过程接收三个参数,分别为 name、age 和 gender,将这些参数插入到 user 表。最后使用 CALL 语句调用该存储过程,插入一条记录。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值