mySQL 教程 第7章 存储过程和函数
存储过程和存储函数
MySQL的存储过程(stored procedure)和函数(stored function)统称为stored routines。
1. MySQL存储过程和函数的区别
函数只能通过return语句返回单个值或者表对象。而存储过程不允许执行return,但是通过out参数返回多个值。
函数是可以嵌入在sql中使用的,可以在select中调用,而存储过程不行。
函数限制比较多,比如不能用临时表,只能用表变量.还有一些函数都不可用等等.而存储过程的限制相对就比较少。
一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。
当存储过程和函数被执行的时候,SQL Manager会到procedure cache中去取相应的查询语句,如果在procedure cache里没有相应的查询语句,SQL Manager就会对存储过程和函数进行编译。
Procedure cache中保存的是执行计划 (execution plan) ,当编译好之后就执行procedure cache中的execution plan,之后SQL SERVER会根据每个execution plan的实际情况来考虑是否要在cache中保存这个plan,评判的标准一个是这个execution plan可能被使用的频率;其次是生成这个plan的代价,也就是编译的耗时。保存在cache中的plan在下次执行时就不用再编译了。
存储过程应用实例
1. 创建没有参数的存储过程
创建存储过程取得最高考分
create PROCEDURE getMaxMark()
begin
select max(mark) 最高分 from `TScore`;
end
-- 调用存储过程
call getMaxMark();
2. 创建带输入参数的存储过程
以下存储过程能够输入的学生号查出该学生的信息 参数Sid代表学号,IN代表输入参数。
CREATE PROCEDURE getStudentByID(IN sid varchar(15))
BEGIN
select * from `TStudent` where studentID=sid;
END
-- 调用该函数
call getStudentByID('')
3. 创建带输入和输出参数的存储过程
创建存储过程,能够输出指定课程的最高分
create PROCEDURE getMaxMarkBySubject(IN subName varchar(30),OUT maxMark int)
begin
select MAX(mark) into maxMark from `TScore` a join `TSubject` b on a.`subJectID`=b.`subJectID`
where b.`subJectName`=subName;
end
-- 调用存储过程,将取出的最大值放到变量@maxScore
CALL getMaxMarkBySubject('计算机网络',@maxScore);
select @maxScore 计算机网络最高分;
CALL getMaxMarkBySubject('数据结构',@maxScore);
select @maxScore 数据结构最高分;
4. 思考:创建存储过程,能够根据指定学号删除学生记录
5. 删除存储过程
drop PROCEDURE `getMaxMarkBySubject`
6. 查看创建的存储过程
7. 根据学生成绩判断是否优秀
以下函数能够根据输入值范围输出成绩是否优良差。
create FUNCTION getGrad1(score int)
RETURNS varchar(50)
BEGIN
return IF(score>90,'成绩优秀',IF(score<90 and score>80,'成绩良好',IF(score<80 and score>70,'成绩一般',IF(score<70 and score>60,'成绩及格','不及格'))));
END
-- 在查询中使用定义的函数
select b.sname 姓名,mark 分数,getGrad1(mark) 成绩级别 from `TScore` a join `TStudent` b on a.`StudentID`=b.`StudentID`
8. 取汉字拼音首字母的函数
先创建获取汉字拼音函数需要用到的表
DROP TABLE IF EXISTS `pinyin`; CREATE TABLE `pinyin` ( `letter` char(1) NOT NULL, `chinese` char(1) NOT NULL, PRIMARY KEY (`letter`) ) ENGINE=MyISAM DEFAULT CHARSET=gbk; INSERT INTO `pinyin` VALUES ('A','驁'),('B','簿'),('C','錯'),('D','鵽'),('E','樲'),('F','鰒'),('G','腂'), ('H','夻'),('J','攈'),('K','穒'),('L','鱳'),('M','旀'),('N','桛'),('O','漚'),('P','曝'),('Q','囕'),('R','鶸'), ('S','蜶'),('T','籜'),('W','鶩'),('X','鑂'),('Y','韻'),('Z','咗');
创建获取汉字拼音的函数
DROP FUNCTION IF EXISTS `PINYIN` CREATE FUNCTION PINYIN(str CHAR(255)) RETURNS char(255) BEGIN DECLARE hexCode char(4); DECLARE pinyin varchar(255); DECLARE firstChar char(1); DECLARE aChar char(1); DECLARE pos int; DECLARE strLength int; SET pinyin = ''; SET strLength = CHAR_LENGTH(LTRIM(RTRIM(str))); SET pos = 1; SET @str = (CONVERT(str USING gbk)); WHILE pos <= strLength DO SET @aChar = SUBSTRING(@str,pos,1); SET hexCode = HEX(@aChar); IF hexCode >= "8140" AND hexCode <= "FEA0" THEN SELECT letter into firstChar FROM pinyin WHERE chinese >= @aChar LIMIT 1; ELSE SET firstChar = @aChar; END IF; SET pinyin = CONCAT(pinyin,firstChar); SET pos = pos + 1; END WHILE; RETURN UPPER(pinyin); END -- 使用函数获取用户的姓名拼音首写字母 select sname 姓名,pinyin(sname) 拼音首字母 from `TStudent`
9. 思考:更改用户邮箱,将用户的邮箱地址设置姓名的拼音缩写
10. 数字转汉字
以下函数能够把阿拉伯数字转化成财务中用到的汉字
create FUNCTION tohanzi (n_LowerMoney DECIMAL) RETURNS VARCHAR(120) BEGIN Declare v_LowerStr VARCHAR(200) ; Declare v_UpperPart VARCHAR(200) ; Declare v_UpperStr VARCHAR(200) ; Declare i_I int ; set v_LowerStr = LTRIM(RTRIM(ROUND(n_LowerMoney,2 ) ) ) ; set i_I = 1 ; set v_UpperStr = '' ; while ( i_I <=char_length(v_LowerStr ) ) do set v_UpperPart = CONCAT( case substring(v_LowerStr,char_length(v_LowerStr) - i_I + 1,1 ) WHEN '.' THEN '元' WHEN '' THEN '零' WHEN '' THEN '壹' WHEN '' THEN '贰' WHEN '' THEN '叁' WHEN '' THEN '肆' WHEN '' THEN '伍' WHEN '' THEN '陆' WHEN '' THEN '柒' WHEN '' THEN '捌' WHEN '' THEN '玖' END, case i_I WHEN 1 THEN '分' WHEN 2 THEN '角' WHEN 3 THEN '' WHEN 4 THEN '' WHEN 5 THEN '拾' WHEN 6 THEN '佰' WHEN 7 THEN '仟' WHEN 8 THEN '万' WHEN 9 THEN '拾' WHEN 10 THEN '佰' WHEN 11 THEN '仟' WHEN 12 THEN '亿' WHEN 13 THEN '拾' WHEN 14 THEN '佰' WHEN 15 THEN '仟' WHEN 16 THEN '万' ELSE '' END ); set v_UpperStr =CONCAT( v_UpperPart , v_UpperStr) ; set i_I = i_I + 1 ; end while; set v_UpperStr = REPLACE(v_UpperStr,'零拾','零') ; set v_UpperStr = REPLACE(v_UpperStr,'零佰','零') ; set v_UpperStr = REPLACE(v_UpperStr,'零仟','零') ; set v_UpperStr = REPLACE(v_UpperStr,'零零零','零') ; set v_UpperStr = REPLACE(v_UpperStr,'零零','零') ; set v_UpperStr = REPLACE(v_UpperStr,'零角零分','整') ; set v_UpperStr = REPLACE(v_UpperStr,'零分','整') ; set v_UpperStr = REPLACE(v_UpperStr,'零角','零') ; set v_UpperStr = REPLACE(v_UpperStr,'零亿零万零元','亿元') ; set v_UpperStr = REPLACE(v_UpperStr,'亿零万零元','亿元') ; set v_UpperStr = REPLACE(v_UpperStr,'零亿零万','亿') ; set v_UpperStr = REPLACE(v_UpperStr,'零万零元','万元') ; set v_UpperStr = REPLACE(v_UpperStr,'万零元','万元') ; set v_UpperStr = REPLACE(v_UpperStr,'零亿','亿') ; set v_UpperStr = REPLACE(v_UpperStr,'零万','万') ; set v_UpperStr = REPLACE(v_UpperStr,'零元','元') ; set v_UpperStr = REPLACE(v_UpperStr,'零零','零') ; if ( '元' = substring(v_UpperStr,1,1)) then set v_UpperStr = substring(v_UpperStr,2,(char_length(v_UpperStr) - 1)); end if; if ( '零' = substring(v_UpperStr,1,1)) then set v_UpperStr = substring(v_UpperStr,2,(char_length(v_UpperStr) - 1)) ; end if; if ( '角' = substring(v_UpperStr,1,1)) then set v_UpperStr = substring(v_UpperStr,2,(char_length(v_UpperStr) - 1)) ; end if; if ( '分' = substring(v_UpperStr,1,1)) then set v_UpperStr = substring(v_UpperStr,2,(char_length(v_UpperStr) - 1)) ; end if; if ('整' = substring(v_UpperStr,1,1)) then set v_UpperStr = '零元整' ; end if; return v_UpperStr; END select tohanzi(20321)
11. 随机产生姓名的函数
该函数,使用三个字符串,存放用户的姓名,使用随机函数从姓名中随机排列组合成人名。
create function create_name() RETURNS varchar(3) begin DECLARE LN VARCHAR(300); DECLARE MN VARCHAR(200); DECLARE FN VARCHAR(200); DECLARE LN_N INT; DECLARE MN_N INT; DECLARE FN_N INT; SET LN='李王张刘陈杨黄赵周吴徐孙朱马胡郭林何高梁郑罗宋谢唐韩曹许邓萧冯曾程蔡彭潘袁于董余苏叶吕魏蒋田杜丁沈姜范江傅钟卢汪戴崔任陆廖姚方金邱夏谭韦贾邹石熊孟秦阎薛侯雷白龙段郝孔邵史毛常万顾赖武康贺严尹钱施牛洪龚'; SET MN='伟刚勇春菊毅俊峰强军平保东文辉力明永健世广志瑗琰韵融园艺咏卿聪澜纯毓悦昭冰爽琬茗羽希宁欣飘育滢馥新利筠柔竹霭凝晓欢霄枫芸菲寒伊亚宜可姬舒义兴良海山仁波宁贵福生龙元全国胜学祥亮政谦亨奇固之岚苑富顺信子杰涛昌成康星光天达安岩中茂进林有坚和彪博诚先敬震振壮会思群豪清飞彬娜静淑惠珠翠雅芝妍茜秋珊莎锦黛青倩婷姣婉娴瑾颖露瑶怡婵雁蓓纨仪荷丹蓉眉君琴蕊薇菁梦素伟刚勇毅俊峰强军平保东文辉力明永健世广志义兴良海山仁波宁贵福生龙元全国胜学祥才发武新利清飞彬富顺信子杰涛昌成康星光天达安岩中茂进林有坚和彪博诚先敬震振壮会思群豪心邦承乐绍功松善厚庆磊民友裕河哲江超浩亮政谦亨奇固之轮翰朗伯宏言若鸣朋斌梁栋维启克伦翔旭鹏泽晨辰士以建家致树炎德行时泰盛雄琛钧冠策腾楠榕风航弘'; SET FN='伟刚勇毅俊云莲真环雪荣爱妹霞香月莺媛艳瑞凡佳嘉琼勤珍贞莉桂娣叶璧才发武丽琳轮翰朗伯宏言若鸣朋斌梁栋维启克伦翔旭鹏泽晨辰士以建家致树炎德河哲江超浩璐娅琦晶裕华慧巧美婕馨影荔枝思心邦承乐绍功松善厚庆磊民友玉萍红娥玲芬芳燕彩兰凤洁梅秀娟英行时泰盛雄琛钧冠策腾楠榕风航弘峰强军平保东文辉力明永健世广志义兴良海山仁波宁贵福生龙元全国胜学祥才发武新利清飞彬富顺信子杰涛昌成康星光天达安岩中茂进林有坚和彪博诚先敬震振壮会思群豪心邦承乐绍功松善厚庆磊民友裕河哲江超浩亮政谦亨奇固之轮翰朗伯宏言若鸣朋斌梁栋维启克伦翔旭鹏泽晨辰士以建家致树炎德行时泰盛雄琛钧冠策腾楠榕风航弘'; SET LN_N=CHAR_LENGTH(LN); SET MN_N=CHAR_LENGTH(MN); SET FN_N=CHAR_LENGTH(FN); return Concat(substring(LN,ceil(rand()*LN_N),1),substring(MN,ceil(rand()*MN_N),1),substring(FN,ceil(rand()*FN_N),1)); end -- 调用函数产生姓名 select create_name() 随机姓名 union select create_name() 随机姓名 union select create_name() 随机姓名 union select create_name() 随机姓名 union select create_name() 随机姓名 union select create_name() 随机姓名 union select create_name() 随机姓名 union select create_name() 随机姓名 union select create_name() 随机姓名 union select create_name() 随机姓名 union select create_name() 随机姓名 union select create_name() 随机姓名 union select create_name() 随机姓名
12. 查看创建的函数
13. 删除存储的函数
drop FUNCTION `tohanzi`
在存储过程和函数中使用变量、判断和循环
MySQL中变量、判断和循环只能在存储过程和存储函数中使用。
14. 在存储过程中使用循环、变量
写一个存储过程,能够给TStudent表插入指定数量的学生记录。身份证号随机产生,姓名随机产生,性别随机,班级随机产生。这其中用到了随机函数,以及上面创建的产生姓名的函数。生日有随机函数产生,范围在1980-1989年,用户的邮箱由用户的姓名首写字母组合而成。
如果已有存储过程,必须先删除
drop procedure addStudent
创建的存储过程
create procedure addStudent(in num int) begin declare i int; set i=1; delete from TStudent; while num>=i do insert TStudent values ( LPAD(convert(i,char(5)),5,''), create_name(), if(ceil(rand()*10)%2=0,'男','女'), RPAD(convert(ceil(rand()*1000000000000000000),char(18)),18,''), Concat('',convert(ceil(rand()*10),char(1)),'-',LPAD(convert(ceil(rand()*12),char(2)),2,''),'-',LPAD(convert(ceil(rand()*30),char(2)),2,'')), Concat(PINYIN(sname),'@hotmail.com'), case ceil(rand()*3) when 1 then '网络与网站开发' when 2 then 'JAVA' ELSE 'NET' END, NOW()); set i=i+1; end while; select * from TStudent; end -- 调用存储过程 call addStudent(100)
15. 创建使用while的存储过程插入学生成绩
插入了100名学生后,执行以下命令。
创建存储过程,能够插入为学生插入分数。存储过程使用两个循环,分数在50-100分之间,使用随机数实现。
drop procedure fillSore
创建存储过程
create procedure fillSore() begin DECLARE St_Num INT; DECLARE Sb_Num INT; DECLARE i1 INT default 1; DECLARE i2 INT default 1; delete from TScore; select count(*) into St_Num from TStudent; select count(*) into Sb_Num from TSubject; while St_Num>=i1 do set i2=1; while Sb_Num>=i2 do insert TScore values (LPAD(convert(i1,char(5)),5,''),LPAD(convert(i2,char(4)),4,''),ceil(50+rand()*50)); set i2=i2+1; END WHILE; set i1=i1+1; END WHILE; End -- 调用存储过程 call fillSore() -- 查询 select * from TScore
16. 创建使用if的函数
If函数支持多层嵌套
create FUNCTION getGrad2(score int) RETURNS varchar(50) BEGIN declare grad varchar(50); if score>90 then set grad='成绩优秀'; else if score>80 then set grad='成绩良好'; else if score>70 then set grad='成绩一般'; else set grad='刚刚及格'; end if; end if; end if; return grad; END -- 使用函数查询数据库 select b.sname 姓名,mark 分数,getGrad2(mark) 成绩级别 from `TScore` a join `TStudent` b on a.`StudentID`=b.`StudentID` limit 5
17. 创建使用case的函数
该函数根据学生的分数,给出评价。
create FUNCTION getGrad3(score int) RETURNS varchar(50) BEGIN declare grad varchar(50); declare mark int; set mark=ceil(score/10); case mark when 9 then set grad='成绩优秀'; when 8 then set grad='成绩良好'; when 7 then set grad='成绩一般'; else set grad='刚刚及格'; end case; return grad; END -- 测试函数 select b.sname 姓名,mark 分数,getGrad3(mark) 成绩级别 from `TScore` a join `TStudent` b on a.`StudentID`=b.`StudentID` limit 5
查看存储过程和存储函数的语句
运行一下命令可以查看创建fillSore存储过程语句
18. 使用show create查看存储过程内容
show create procedure fillSore
19. 使用管理工具产生查看创建存储过程的语句
作业:
20. 统计男生和女生人数
21. 统计各班人数
22. 把重姓的学生找出来
23. 找出身份证号末尾是偶数的学生。
24. 查询出生年月在1985-01-00到1988-01-00之间的学生。
25. 统计各班“计算机网络”平均分
26. 找出“计算机网络”不及格的男同学
http://www.cnblogs.com/kscnchina/archive/2013/03/01/2938808.html
MySQL之自定义函数
引言
MySQL本身提供了内置函数,这些函数的存在给我们日常的开发和数据操作带来了很大的便利,比如我前面提到过的聚合函数SUM()、AVG()以及日期时间函数等等,可是我们总会出现其他的需求:我们需要调用一个函数,这个函数需要按照我们的要求来实现我们自己的功能,可是这个函数式系统不能提供的因为这中需求的不确定性。因此我们需要自己来解决这种需求。还好MySQL设计的扩展性给了我们这个机会,我们可以通过自定义函数的功能解决这个问题。
1.MySQL自定义函数简介
在MySQL中使用自定义函数也需要相应的要求,语法如下,
创建新函数:
Create function function_name(参数列表)
returns返回值类型
函数体内容
相关说明,
- 函数名:应该合法的标识符,并且不应该与已有的关键字冲突。一个函数应该属于某数据库,可以使用db_name.funciton_name的形式执行当前函数所属数据库
,否则默认为当前数据库。
- 参数列表:可以有一个或者多个函数参数,甚至是没有参数也是可以的。对于每个参数,由参数名和参数类型组成。
- 返回值:指明返回值类类型
- 函数体:自定义函数的函数体由多条可用的MySQL语句,流程控制,变量声明等语句构成。需要指明的是函数体中一定要含有return 返回语句。
2.自定义示例
a.无参函数定义
mysql> DROP FUNCTION IF EXISTS hello;
Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> DELIMITER $$
mysql> CREATE FUNCTION hello()
-> RETURNS VARCHAR(255)
-> BEGIN
-> RETURN 'Hello world,i am mysql';
-> END $$
Query OK, 0 rows affected (0.11 sec)
调用自定义函数:
mysql> DELIMITER ;
mysql> SELECT hello();
+-------------------------+
| hello() |
+-------------------------+
| Hello world,i am mysql |
+-------------------------+
1 row in set (0.00 sec)
可见已经调用成功了,需要注意的几点
之所以使用DELIMITER是因为MySQL中默认是使用分号来结束一个命令的,我们定义的函数体中一条命令写完时会用分号来结束,而MySQL会误以为函数体已经定义完成,因为我们需要定义一个新的标识符来标识一个命令的结束,因为就可以使用DELIMITER。
b:含有参数的自定义函数
在我们格式化日期的时候我们会调用DATE_FORMAT(date,format)函数,第一个参数是日期第二个参数是需要格式化的格式,也就是说需要传递两个参数,我们现在就把这个函数给改下
mysql> DELIMITER $$
mysql> DROP FUNCTION IF EXISTS test.formatDate $$
Query OK, 0 rows affected, 1 warning (0.07 sec) mysql> CREATE FUNCTION test.formatDate(fdate datetime)
-> RETURNS VARCHAR(255)
-> BEGIN
-> DECLARE x VARCHAR(255) DEFAULT '';
-> SET x= date_format(fdate,'%Y年%m月%d日%h时%i分%s秒');
-> RETURN x;
-> END $$
Query OK, 0 rows affected (0.11 sec) mysql> DELIMITER ;
mysql> SELECT formatDate(now());
+----------------------------+
| formatDate(now()) |
+----------------------------+
| 2014年11月21日03时41分21秒 |
+----------------------------+
1 row in set (0.18 sec)
这样当我们需要定制这样的函数时就可以自己实现了,那就是通过含参的自定义函数。
3.自定义函数相关语法及变量
a:变量声明
DECLARE var_name[,...] type [DEFAULT value] ,这个语句被用来声明局部变量。要给变量提供一个默认值,请包含一个DEFAULT子句。值可以被指定为一个表达式,不需要为一个常数。如果没有DEFAULT子句,初始值为NULL。使用语序使用 set 和 select into语句为变量赋值。
b:IF 条件语句、
IF search_conditionTHEN statement_list [ELSEIF search_conditionTHENstatement_list] ... [ELSE statement_list] ENDIF;
c:CASE语句
CASE case_value WHEN when_valueTHENstatement_list [WHEN when_value THENstatement_list] ... [ELSE statement_list] END CASE;
d:循环语句
While [begin_label:]WHILEsearch_conditionDO statement_list END WHILE [end_label]; 退出整个循环leave 相当于break 退出当前循环iterate 相当于 continue 通过退出的标签决定退出哪个循环。
4.其他相关
删除函数我们可以使用 DROP FUNCTION IF EXISTS function_name;
mysql> SELECT hello();
+-------------------------+
| hello() |
+-------------------------+
| Hello world,i am mysql |
+-------------------------+
1 row in set (0.12 sec) mysql> DROP FUNCTION hello();
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right s
mysql> DROP FUNCTION hello;
Query OK, 0 rows affected (0.47 sec) mysql> SELECT hello();
ERROR 1305 (42000): FUNCTION test.hello does not exist
通过打印的错误可以发现有些是需要注意的
查看定义的函数 SHOW FUCNTION STATUS LIKE 'function_name',或者是使用SHOW CREATE FUNCTION function_name;
mysql> SHOW FUNCTION STATUS LIKE 'hello';
+------+-------+----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| Db | Name | Type | Definer | Modified | Created | Security_type | Comment | character_set_client | collation_connection | Database Collation |
+------+-------+----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| test | hello | FUNCTION | root@localhost | 2014-11-21 14:48:05 | 2014-11-21 14:48:05 | DEFINER | | latin1 | latin1_swedish_ci | latin1_swedish_ci |
+------+-------+----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
1 row in set (0.18 sec) mysql> SHOW CREATE FUNCTION hello;
+----------+----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------
-----------+----------------------+----------------------+--------------------+
| Function | sql_mode | Create Function
| character_set_client | collation_connection | Database Collation |
+----------+----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------
-----------+----------------------+----------------------+--------------------+
| hello | STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | CREATE DEFINER=`root`@`localhost` FUNCTION `hello`() RETURNS varchar(255) CHARSET latin1
BEGIN
RETURN 'Hello world,i am mysql';
END | latin1 | latin1_swedish_ci | latin1_swedish_ci |
+----------+----------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------
-----------+----------------------+----------------------+--------------------+
1 row in set (0.01 sec)
修改函数ALTER FUNCTION function_name 函数选项。
ALTER FUNCTION func_name [characteristic ...] characteristic:
COMMENT 'string'
| LANGUAGE SQL
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
上面这个语法结构是MySQL官方给出的,修改的内容可以包含SQL语句也可以不包含,既可以是读数据的SQL也可以是修改数据的SQL还有权限。此外在修改function的时候还需要注意你不能使用这个语句来修改函数的参数以及函数体,如果你想改变这些的话你就需要删除掉这个函数然后重新创建。
mysql> SELECT hello();
+-------------------------+
| hello() |
+-------------------------+
| Hello world,i am mysql |
+-------------------------+
1 row in set (0.00 sec) mysql> ALTER FUNCTION hello
->
-> READS SQL DATA
-> COMMENT 'print hello';
Query OK, 0 rows affected (0.23 sec) mysql> SELECT SPECIFIC_NAME,SQL_DATA_ACCESS,
-> ROUTINE_COMMENT FROM information_schema.Routines
-> WHERE ROUTINE_NAME='hello';
+---------------+-----------------+-----------------+
| SPECIFIC_NAME | SQL_DATA_ACCESS | ROUTINE_COMMENT |
+---------------+-----------------+-----------------+
| hello | READS SQL DATA | print hello |
+---------------+-----------------+-----------------+
1 row in set (0.21 sec)
mySQL 教程 第7章 存储过程和函数的更多相关文章
- MySQL基础之第14章 存储过程和函数
避免编写重复的语句 安全性可控 执行效率高 14.1.创建存储过程和函数 14.1.1.创建存储过程 CREATE PROCEDUREsp_name ([proc_parameter[,...]]) ...
- 【MySQL笔记】触发器,存储过程和函数
一.触发器 触发器(TRIGGER):是由事件来触发某个操作.当数据库系统执行这些事件时,就会激活触发器执行相应的操作.MySQL从5.0.2版本开始支持触发器. 触发事件:INSERT语句.UPDA ...
- MYSQL数据库学习十四 存储过程和函数的操作
14.1 为什么使用存储过程和函数 一个完整的操作会包含多条SQL语句,在执行过程中需要根据前面SQL语句的执行结果有选择的执行后面的SQL语句. 存储过程和函数的优点: 允许标准组件式编程,提高了S ...
- mysql 开发基础系列17 存储过程和函数(上)
一. 概述 存储过程和函数是事先经过编译并存储在数据库中的一段sql语句集合,可以简化应用开发人员的很多工作,减少数据在数据库与应用服务器之间的传输,提高数据处理效率是有好处的.存储过程和函数的区别在 ...
- MySQL学习笔记:调用存储过程或函数报1418错误
问题 MySQL开启bin-log后,调用存储过程或者函数以及触发器时,会出现错误号为1418的错误: ERROR 1418 (HY000): This function has none of DE ...
- mysql 开发基础系列18 存储过程和函数(下)
1. 光标的使用(游标) 在存储过程和函数中可以使用光标对结果集进行循环的处理,光标使用包括光标的声明,open ,fetch,close. 下面在存储过程中使用一个光标, 这个举例中光标里的逻辑不重 ...
- mySQL教程 第1章 数据库设计
E-R设计 很多同学在学SQL语句时,觉得非常困难,那是因为你在学一个你根本不了解的数据库,数据库中的表不是你设计的,表与表之间的关系你不明白.因此在学SQL语句之前,先介绍一下数据库设计. 下面举例 ...
- mySQL 教程 第4章 数据查询
mySQL运算符 这些运算符在SQL查询中用得到. 算数运算符 + 加 - 减 * 乘 / DIV 除 % MOD 取余数 比较运算符 = 等于 <> != 不等于 < <= ...
- mySQL 教程 第3章 数据类型和数据完整性
准备数据库 创建练习数据库,以下实验都是在这个数据库中完成. 练习1:比较各种数值型 create table tmp1 ( id INT, name VARCHAR(25), deptId deci ...
随机推荐
- 移动WEB 性能优化方案
最近一项 研究表明,80%的网民对移动端的浏览体验感到失望,同时,当体验提升时,他们会在智能手机上花费更多的时间. 这不奇怪,因为64%的智能手机用户希望网站可以在4秒内加载完毕,但一半的网站花费了二 ...
- fastjson生成json时Null属性不显示
举个例子 生成JSON代码片段 Map < String , Object > jsonMap = new HashMap< String , Object>(); jsonM ...
- Nginx 笔记与总结(13)Nginx 的 gzip 压缩
使用 FireFox(40.0)访问博客园(http://www.cnblogs.com/),观察 http 头信息 请求头信息: Accept-Encoding gzip, deflate 表示浏览 ...
- 关于DWZ模板中全选的使用
只在使用DWZ框架时有用 模板中 <input type="checkbox" name="rule_id[]" />选项1 <input t ...
- Bootstrap页面布局21 - BS对话框设计
设计弹出层对话框: 设计一个点击登录按钮,再弹出一个登陆对话框的实例,且带有动画效果 <div class='container-fluid'> <h2 class='page-he ...
- Bootstrap页面布局16 - BS导航菜单和其响应式布局以及导航中的下拉菜单
代码: <div class='container-fluid'> <h2 class='page-header'>导航</h2> <!-- .navrbar ...
- bug 发表文章不显示图片
bug 描述: 现象是我们这不能发布图片, 测试说患教方向是可以正常发布图片的(还是要感激测试,正是他们鞭策我们不断挑战困难,解决之,从而提高自己姿势水平). 图片没上传上去, 服务端协助查找发现没调 ...
- SQL查询语句中的 limit offset(转 )
经常用到在数据库中查询中间几条数据的需求 比如下面的sql语句: ① selete * from testtable limit 2,1; ② selete * from testtable limi ...
- java CyclicBarrier
import java.io.IOException; import java.util.Random; import java.util.concurrent.BrokenBarrierExcept ...
- TM2013修改帐号数据目录
M 2013安装以后,聊天记录文件夹默认的保存位置是在“我的文档”中“Tencent Files”,而QQ就可以在软件系统设置中进行指定,但TM2013没有这一栏设置,那么如何才能修改聊天记录文件夹保 ...