mySQL的存储过程详解
其实,关于声明分割符,上面的注解已经写得很清楚,不需要多说,只是稍微要注意一点的是:如果是用的管理工具时,可以直接创建,不再需要声明。
(3).参数
存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,,形式如:
([[IN |OUT | ]参数名数据类形...])
IN输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
OUT输出参数:该值可在存储过程内部被改变,并可返回
输入输出参数:调用时指定,并且可被改变和返回
Ⅰ. IN参数例子
创建:
>// >() ->->;->=2;->;->END;->// >;
执行结果:
>SET@p_in=1; >r(@p_in); +------+|p_in| +------+|1|+------++------+|p_in| +------+|2|+------+>@p_in; +-------+|@p_in| +-------+|1| +-------+
以上可以看出mysql存储过程怎么写,p_in虽然在存储过程中被修改,但并不影响@p_id的值
Ⅱ.OUT参数例子
创建:
>// >() ->->; ->=2; ->; ->END; ->// >;
执行结果:
>SET@=1; >(@); +-------+||+-------+|NULL|+-------++-------+|| +-------+|2|+-------+>@; +-------+|| +-------+|2| +-------+
Ⅲ. 参数例子
创建:
>// >() ->->; ->=2; ->;->END; ->//>;
执行结果:
>SET@=1; >eter(@); +---------+ || +---------+ |1| +---------+ +---------+ ||+---------+ |2| +---------+ >@; +----------+ |@|+----------+ |2| +----------+
(4).变量
Ⅰ.变量定义
[,...] [ ];
其中,为的数据类型,如:int, , date, ()
例如:
; er(8,2).95; AULT'1999-12-31'; '1999-12-3123:59:59'; har(255)'';
Ⅱ.变量赋值
SET变量名=表达式值[, = ...]
Ⅲ.用户变量
ⅰ.在客户端使用用户变量
>''into@x; >@x; +-------------+|@x| +-------------+|| +-------------+>SET@y=''; >@y; +---------------------+|@y| +---------------------+|| +---------------------+>SET@z=1+2+3; >@z; +------+|@z| +------+|6| +------+
ⅱ.在存储过程中使用用户变量
>()(@,''); >SET@=''; >(); +----------------------------+|(@,'')| +----------------------------+|| +----------------------------+
ⅲ.在存储过程间传递全局范围的用户变量
>()SET@='p1'; >()('',@); >(); >(); +-----------------------------------------------+|('',@| +-----------------------------------------------+|| +-----------------------------------------------+
注意:
①用户变量名一般以@开头
②滥用用户变量会导致程序难以理解及管理
(5).注释
存储过程可使用两种风格的注释
双模杠:--
该风格一般用于单行注释
c风格:一般用于多行注释
例如:
>// >--name存储过程名->()->->(10);->=->='';->ELSE->='';->;->ES(); ->END->// >;
4.存储过程的调用
用call和你过程名以及一个括号,括号里面根据需要,加入参数mysql存储过程怎么写,参数包括输入参数、输出参数、输入输出参数。具体的调用方法可以参看上面的例子。
5.存储过程的查询
我们像知道一个数据库下面有那些表,我们一般采用show ;进行查看。那么我们要查看某个数据库下面的存储过程,是否也可以采用呢?答案是,我们可以查看某个数据库下面的存储过程,但是是令一钟方式。
我们可以用
name from .proc db=’数据库名’;
或者
from . ='数据库名';
或者
show db='数据库名';
进行查询。
如果我们想知道,某个存储过程的详细,那我们又该怎么做呢?是不是也可以像操作表一样用表名进行查看呢?
答案是:我们可以查看存储过程的详细,但是需要用另一种方法:
SHOW 数据库.存储过程名;
就可以查看当前存储过程的详细。
6.存储过程的修改
更改用 建立的预先指定的存储过程mysql存储过程怎么写,其不会影响相关存储过程或存储功能。
7.存储过程的删除
删除一个存储过程比较简单,和删除表一样:
DROP
从的表格中删除一个或多个存储过程。
8.存储过程的控制语句
(1).变量作用域
内部的变量在其作用域范围内享有更高的优先权,当执行到end。变量时,内部变量消失,此时已经在其作用域外,变量不再可见了,应为在存储
过程外再也不能找到这个申明的变量,但是你可以通过out参数或者将其值指派
给会话变量来保存其值。
>// >() ->->(5)''; ->->(5)''; ->; ->end; ->; ->end; ->// >;
(2).条件语句
Ⅰ. if-then -else语句
>// >() ->->; ->=+1; ->=->(17); ->; ->=->=s1+1; ->else->=s1+2; ->; ->end; ->// >;
Ⅱ. case语句:
>// >() ->->; ->=+1; -> ->->(17); ->->(18); ->else->(19); ->; ->end; ->// >;
(3).循环语句
Ⅰ. ···· end :
>// >() ->->; ->=0; ->->(var); ->=var+1; ->; ->end; ->// >;
Ⅱ. ···· end :
它在执行操作后检查结果,而则是执行前进行检查。
>// >() ->->; ->setv=0; -> ->(v); ->setv=v+1; ->>=5 ->; ->end; ->// >;
Ⅲ. loop ·····end loop:
loop循环不需要初始条件,这点和循环相似,同时和循环一样不需要结束条件, 语句的意义是离开循环。
>// >() ->->; ->setv=0; ->:loop ->(v); ->setv=v+1; ->ifv>=->; ->; ->; ->end; ->// >;
Ⅳ. 标号:
标号可以用在 或者loop语句前,语句标号只能在合法的语句前面使用。可以跳出循环,使运行指令达到复合语句的最后一步。
(4). 迭代
Ⅰ. :
通过引用复合语句的标号,来从新开始复合语句
>// >0() ->->; ->setv=0; ->:loop ->ifv=->setv=v+1; ->; ->; ->(v); ->setv=v+1; ->ifv>=->; ->; ->; ->end; ->// >;
9.存储过程的基本函数
(1).字符串类
(str) //返回字串字符集
( [,... ]) //连接字串
( , ) //返回首次在中出现的位置,不存在返回0
( ) //转换成小写
LEFT ( , ) //从中的左边起取个字符
( ) //长度
( ) //从文件读取内容
( , [, ] )同,但可指定开始位置
LPAD ( , ,pad ) //重复用pad加在开头,直到字串长度为
( ) //去除前端空格
( , ) //重复次
(str , , ) //在str中用替换
RPAD ( , ,pad) //在str后用pad补充,直到长度为
( ) //去除后端空格
( , ) //逐字符比较两字串大小,
(str , [, ]) //从str的开始,取个字符,
注:中处理字符串时,默认第一个字符下标为1,即参数必须大于等于1
>('abcd',0,2); +-----------------------+|('abcd',0,2)| +-----------------------+|| +-----------------------+(0.) >('abcd',1,2); +-----------------------+|('abcd',1,2)| +-----------------------+|ab| +-----------------------+(0.)
TRIM([[BOTH||] [] FROM]) //去除指定位置的指定字符
( ) //转换成大写
(,) //取最后个字符
() //生成个空格
(2).数学类
ABS ( ) //绝对值
BIN ( ) //十进制转二进制
( ) //向上取整
CONV(,,) //进制转换
( ) //向下取整
(, ) //保留小数位数
HEX ( ) //转十六进制
注:HEX()中可传入字符串,则返回其ASC-11码,如HEX('DEF')返回
也可以传入十进制整数,返回其十六进制编码,如HEX(25)返回19
( , [,..]) //求最小值
MOD ( , ) //求余
( , ) //求指数
RAND([seed]) //随机数
( [, ]) //四舍五入,为小数位数]
注:返回类型并非均为整数,如:
(1)默认变为整形值
>(1.23); +-------------+|(1.23)| +-------------+|1| +-------------+(0.) >(1.56); +-------------+|(1.56)| +-------------+|2| +-------------+(0.)
(2)可以设定小数位数,返回浮点型数据
>(1.567,2); +----------------+|(1.567,2)| +----------------+|1.57| +----------------+(0.)
SIGN ( ) //
(3).日期时间类
( , ) //将加到
( , ,toTZ ) //转换时区
( ) //当前日期
( ) //当前时间
( ) //当前时间戳
DATE ( ) //返回的日期部分
( , ) //在中加上日期或时间
( , ) //使用格式显示
( , ) //在上减去一个时间
( , ) //两个日期差
DAY (date ) //返回日期的天
(date ) //英文星期
(date ) //星期(1-7) ,1为星期天
(date ) //一年中的第几天
( FROM date ) //从date中提取日期的指定部分
(year ,day ) //给出年及年中的第几天,生成日期串
(hour , , ) //生成时间串
(date ) //英文月份名
NOW ( ) //当前时间
( ) //秒数转成时间
( , ) //字串转成时间,以格式显示
( , ) //两个时间差
(time ) //时间转秒数]
WEEK ( [, ]) //第几周
YEAR ( ) //年份
() //月的第几天
HOUR() //小时
(date) //date的月的最后日期
() //微秒
() //月
() //分返回符号,正负或0
SQRT() //开平方
独立PHP技术博客
免责声明:本文系转载,版权归原作者所有;旨在传递信息,不代表本站的观点和立场和对其真实性负责。如需转载,请联系原作者。如果来源标注有误或侵犯了您的合法权益或者其他问题不想在本站发布,来信即删。