mysql学习记录:存储过程和函数
2018-01-02 14:33
826 查看
存储过程和函数优点:执行快,网络资源耗费少、安全性、允许组件式编程,提高了sql语句重用性和可移植性。
存储过程和函数缺点:sql语句复杂、编写过程中需要创建数据库对象的权限。
存储过程和触发器区别:存储过程是主动调用;触发器是被动触发。
1.创建存储过程的语法形式
CREATE PROCEDURE procedure_name(procedure_parameter[,...]) [characteristic ...] routine_body
procedure_name:所要创建的存储过程名字,推荐proce_XXX命名方式;
procedure_parameter:存储过程的参数,[ IN | OUT | INOUT ] parameter_name type;
characteristic:存储过程的特性;
routine_body:存储过程的sql语句代码,用BEGIN.....END来表示开始和结束。
charateristic参数的取值:
2.例子
例1:
执行:
set @n=3;
CALL proce_book_update(@n);
例2:
执行:CALL proce_book_add();
3.流程控制
1)条件控制
IF:与Java中的判断语句IF...THEN,ELSE IF...,ELSE一样;
CASE:与枚举类似,case_value表示条件判断的变量,参数when_value表示条件判断变量的值。
LOOP:无条件循环控制;
ALTER PROCEDURE proce_name [characteristic...]
characteristic:
| {contains sql | no sql | reads sql data | modifies sql data}
| sql security {definer | invoker}
| comment 'string'
如:ALTER PROCEDURE proce_owner_two COMMENT '测试while循环体语句';
5.删除存储过程
DROP PROCEDURE proce_name;
如:DROP PROCEDURE proce_owner_two;
6.函数
函数总体上与存储过程差不多,主要就是关键字编程了FUNCTION。
如:
// 创建函数,注意returns type
DELIMITER $$
CREATE
/*[DEFINER = { user | CURRENT_USER }]*/
FUNCTION func_book_one(bid INT(11))
RETURNS VARCHAR(100)
/*LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'*/
BEGIN
RETURN (SELECT bname FROM t_book WHERE id=bid);
END $$
DELIMITER ;
执行:select func_book_one(2);删除函数:drop function func_book_one;
PS:存储过程还有【声明】、【游标】。
存储过程和函数缺点:sql语句复杂、编写过程中需要创建数据库对象的权限。
存储过程和触发器区别:存储过程是主动调用;触发器是被动触发。
1.创建存储过程的语法形式
CREATE PROCEDURE procedure_name(procedure_parameter[,...]) [characteristic ...] routine_body
procedure_name:所要创建的存储过程名字,推荐proce_XXX命名方式;
procedure_parameter:存储过程的参数,[ IN | OUT | INOUT ] parameter_name type;
characteristic:存储过程的特性;
routine_body:存储过程的sql语句代码,用BEGIN.....END来表示开始和结束。
charateristic参数的取值:
LANGUAGE SQL //存储过程的routine_body由sql语言的语句组成,为MySQL软件所有默认的语句; | [NOT] DETERMINISTIC //存储结果是否确定; | {CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA} //|包含sql语句,但不包含读或写数据的语句;|不包含sql语句;|包含读数据的语句;|包含写数据的语句;默认CONTAINS SQL
| SQL SECURITY {DEFINER|INVOKER} //设置谁有权限来执行;DEFINER:定义着自己 | INVOKER:调用者;默认DEFINER
| COMMENT 'string' //注释
2.例子
例1:
DELIMITER $$ CREATE PROCEDURE proce_book_update(IN n INT) LANGUAGE SQL NOT DETERMINISTIC CONTAINS SQL COMMENT '减少n本书后,还剩多少本书' BEGIN UPDATE t_book SET number=number-n WHERE id=1; END $$ DELIMITER ;
执行:
set @n=3;
CALL proce_book_update(@n);
例2:
DELIMITER $$ CREATE PROCEDURE proce_book_add() COMMENT '添加图书' BEGIN INSERT INTO t_book VALUES(NULL,'Linux命令行与shell脚本编程大全','Richard Bium Christine Bresnahan',47,'计算机','Linux学习书籍',3); END $$ DELIMITER ;
执行:CALL proce_book_add();
3.流程控制
1)条件控制
IF:与Java中的判断语句IF...THEN,ELSE IF...,ELSE一样;
CASE:与枚举类似,case_value表示条件判断的变量,参数when_value表示条件判断变量的值。
// 关键字IF IF search_condition THEN statement_list [ELSE IF search_condition THEN statement_list] [ELSE search_condition] END IF //关键字CASE CASE case_value WHEN when_value 4000 THEN statement_list [WHEN when_value THEN statement_list] [ELSE statement_list] END CASE
// 关键字if的实例 DELIMITER $$ CREATE PROCEDURE proce_owner_one(IN parameter INT) COMMENT '测试IF控制语句' BEGIN IF parameter>10 THEN INSERT INTO t_owner VALUES(NULL,'yyy'); ELSE UPDATE t_owner o SET o.owner_name='rrr' WHERE o.owner_id=4; END IF; END $$ DELIMITER ;2)循环控制语句
LOOP:无条件循环控制;
// 关键字LOOP [begin_lable:]LOOP //lable标志必须一样,可以省略 statemnt_list END LOOP [end_lable] //离开循环LEAVE lableWHILE:满足条件才执行循环体语句
// 关键字WHILE [begin_lable:]WHILE search_condition DO //condition循环的执行条件 statement_list END WHILE [end_lable]REPEAT:在满足条件内执行循环体语句
// 关键字REPEAT // 注意:满足条件执行循环语句 [begin_lable:]REPEAT statement_list
UNTIL search_condition END REPEAT [end_lable]
// 循环关键字repeat DELIMITER $$ CREATE PROCEDURE proce_owner_three(IN parameter INT) COMMENT '测试repeat循环体语句' BEGIN REPEAT INSERT INTO t_owner VALUES(NULL,'eee'); UNTIL parameter>2 SET parameter=parameter-1; END REPEAT; END $$ DELIMITER ; // 执行: SET @parameter=4; CALL proce_owner_three(@parameter);4.修改存储过程
ALTER PROCEDURE proce_name [characteristic...]
characteristic:
| {contains sql | no sql | reads sql data | modifies sql data}
| sql security {definer | invoker}
| comment 'string'
如:ALTER PROCEDURE proce_owner_two COMMENT '测试while循环体语句';
5.删除存储过程
DROP PROCEDURE proce_name;
如:DROP PROCEDURE proce_owner_two;
6.函数
函数总体上与存储过程差不多,主要就是关键字编程了FUNCTION。
如:
// 创建函数,注意returns type
DELIMITER $$
CREATE
/*[DEFINER = { user | CURRENT_USER }]*/
FUNCTION func_book_one(bid INT(11))
RETURNS VARCHAR(100)
/*LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'*/
BEGIN
RETURN (SELECT bname FROM t_book WHERE id=bid);
END $$
DELIMITER ;
执行:select func_book_one(2);删除函数:drop function func_book_one;
PS:存储过程还有【声明】、【游标】。
相关文章推荐
- Mysql学习总结(11)——MySql存储过程与函数
- MYSQL存储过程和函数学习笔记
- 转:mysql存储过程学习笔记--常用函数收藏
- MySQL存储过程中的基本函数和触发器的相关学习教程
- 学习笔记-mysql_存储过程和函数
- Mysql学习总结(11)——MySql存储过程与函数
- mysql 函数和存储过程的学习
- MySQL学习之存储过程和函数
- mysql存储过程学习笔记--常用函数
- MySQL存储过程中的基本函数和触发器的相关学习教程
- mysql 存储过程中 使用变量做表明[学习记录]
- SQL Server与MySQL存储过程学习记录之一
- mysql存储过程学习记录
- Mysql学习笔记七,存储过程和函数
- MySQL学习笔记 4:自定义函数和MySQL存储过程
- Mysql存储过程学习笔记--变量、参数、注释
- php调用mysql存储过程和函数的方法
- mysql 5.0存储过程学习总结
- 使用MySQL存储过程连续插入多条记录
- mysql存储过程基本函数