您的位置:首页 > 数据库 > MySQL

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参数的取值:

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 lable
WHILE:满足条件才执行循环体语句

// 关键字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:存储过程还有【声明】、【游标】。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: