1. 存储过程例子:

DELIMITER $$   DROP PROCEDURE IF EXISTS HelloWorld$$
CREATE PROCEDURE HelloWorld()
BEGIN   SELECT "Hello World!";
END$$   DELIMITER ;

2. 变量声明

使用DECLARE来声明,DEFAULT赋默认值,SET赋值

DECLARE counter INT DEFAULT 0;
SET counter = counter+1;  

3. 参数

IN为默认类型,值必须在调用时指定,值不能返回(值传递)

out值可以返回(指针传递)

INOUT值必须在调用时指定,值可以返回

CREATE PROCEDURE test(a INT, OUT b FLOAT, INOUT c INT)  

4. 条件判断

IF THENELSEIFELSEEND IF

DELIMITER $$   DROP PROCEDURE IF EXISTS discounted_price$$
CREATE PROCEDURE discunted_price(normal_price NUMERIC(8, 2), OUT discount_price NUMERIC(8, 2))
BEGIN   IF (normal_price > 500) THEN   SET discount_price = normal_price * .8;   ELSEIF (normal_price > 100) THEN   SET discount_price = normal_price * .9;   ELSE   SET discount_price = normal_price;   END IF;
END$$   DELIMITER ;  

5. 循环

DELIMITER $$   DROP PROCEDURE IF EXISTS simple_loop$$   CREATE PROCEDURE simple_loop(OUT counter INT)
BEGIN   SET counter = 0;   my_simple_loop: LOOP   SET counter = counter+1;   IF counter = 10 THEN   LEAVE my_simple_loop;   END IF;   END LOOP my_simple_loop;
END$$   DELIMITER ;  

6. WHILE DO、END WHILE

DELIMITER $$   DROP PROCEDURE IF EXISTS simple_while$$   CREATE PROCEDURE simple_while(OUT counter INT)
BEGIN   SET counter = 0;   WHILE counter != 10 DO   SET counter = counter+1;   END WHILE;
END$$   DELIMITER ;  

7. REPEAT、UNTILL 

DELIMITER $$   DROP PROCEDURE IF EXISTS simple_repeat$$   CREATE PROCEDURE simple_repeat(OUT counter INT)
BEGIN   SET counter = 0;   REPEAT   SET counter = counter+1;   UNTIL counter = 10 END REPEAT;
END$$   DELIMITER ; 

8. 异常处理 
如果用cursor获取SELECT语句返回的所有结果集时应该定义NOT FOUND error handler来防止存储程序提前终结 
如果SQL语句可能返回constraint violation等错误时应该创建一个handler来防止程序终结

9. 数据库交互 
INTO用于存储单行记录的查询结果

DECLARE total_sales NUMERIC(8, 2);
SELECT SUM(sale_value) INTO total_sales FROM sales WHERE customer_id=in_customer_id;  

10. CURSOR用于处理多行记录的查询结果

DELIMITER $$   DROP PROCEDURE IF EXITS cursor_example$$
CREATE PROCEDURE cursor_example()   READS SQL DATA
BEGIN   DECLARE l_employee_id INT;   DECLARE l_salary NUMERIC(8,2);   DECLARE l_department_id INT;   DECLARE done INT DEFAULT 0;   DECLARE cur1 CURSOR FOR SELECT employee_id, salary, department_id FROM employees;   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;   OPEN cur1;   emp_loop: LOOP   FETCH cur1 INTO l_employee_id, l_salary, l_department_id;   IF done=1 THEN   LEAVE emp_loop;   END IF;   END LOOP emp_loop;   CLOSE cur1;
END$$
DELIMITER ;  

11. unbounded SELECT语句用于存储过程返回结果集

DELIMITER $$
DROP PROCEDURE IF EXISTS sp_emps_in_dept$$
CREATE PROCEDURE sp_emps_in_dept(in_employee_id INT)
BEGIN   SELECT employee_id, surname, firstname, address1, address2, zipcode, date_of_birth FROM employees WHERE department_id=in_employee_id;
END$$   DELIMITER ;  

12. UPDATE、INSERT、DELETE、CREATE TABLE非查询语句也可以嵌入存储过程里

DELIMITER $$   DROP PROCEDURE IF EXITS sp_update_salary$$
CREATE PROCEDURE sp_update_salary(in_employee_id INT, in_new_salary NUMERIC(8,2))
BEGIN   IF in_new_salary < 5000 OR in_new_salary > 500000 THEN   SELECT "Illegal salary: salary must be between $5000 and $500, 000";   ELSE   UPDATE employees SET salary=in_new_salary WHERE employee_id=in_employee_id;   END IF:
END$$   DELIMITER ;  

13. 使用CALL调用存储程序

DELIMITER $$   DROP PROCEDURE IF EXISTS call_example$$
CREATE PROCEDURE call_example(employee_id INT, employee_type VARCHAR(20))   NO SQL
BEGIN   DECLARE l_bonus_amount NUMERIC(8,2);   IF employee_type='MANAGER' THEN   CALL calc_manager_bonus(employee_id, l_bonus_amount);   ELSE   CALL calc_minion_bonus(employee_id, l_bonus_amount);   END IF;   CALL grant_bonus(employee_id, l_bonus_amount);
END$$
DELIMITER ;  

14. 一个复杂的例子

CREATE PROCEDURE putting_it_all_together(in_department_id INT)   MODIFIES SQL DATA
BEGIN   DECLARE l_employee_id INT;   DECLARE l_salary NUMERIC(8,2);   DECLARE l_department_id INT;   DECLARE l_new_salary NUMERIC(8,2);   DECLARE done INT DEFAULT 0;   DECLARE cur1 CURSOR FOR   SELECT employee_id, salary, department_id   FROM employees   WHERE department_id=in_department_id;   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;   CREATE TEMPORARY TABLE IF NOT EXISTS emp_raises   (employee_id INT, department_id INT, new_salary NUMERIC(8,2));   OPEN cur1;   emp_loop: LOOP   FETCH cur1 INTO l_employee_id, l_salary, l_department_id;   IF done=1 THEN    /* No more rows */  LEAVE emp_loop;   END IF;   CALL new_salary(1_employee_id, l_new_salary); /* Get new salary */  IF (l_new_salary <> l_salary) THEN  /* Salary changed */  UPDATE employees   SET salary=l_new_salary   WHERE employee_id=l_employee_id;   /* Keep track of changed salaries */  INSERT INTO emp_raises(employee_id, department_id, new_salary)   VALUES (l_employee_id, l_department_id, l_new_salary);   END IF:   END LOOP emp_loop;   CLOSE cur1;   /* Print out the changed salaries */  SELECT employee_id, department_id, new_salary from emp_raises   ORDER BY employee_id;
END;  

15. 存储方法 
存储方法与存储过程的区别 
1,存储方法的参数列表只允许IN类型的参数,而且没必要也不允许指定IN关键字 
2,存储方法返回一个单一的值,值的类型在存储方法的头部定义 
3,存储方法可以在SQL语句内部调用 
4,存储方法不能返回结果集

CREATE   [DEFINER = { user | CURRENT_USER }]   PROCEDURE sp_name ([proc_parameter[,...]])   [characteristic ...] routine_body   CREATE   [DEFINER = { user | CURRENT_USER }]   FUNCTION sp_name ([func_parameter[,...]])   RETURNS type   [characteristic ...] routine_body   proc_parameter:   [ IN | OUT | INOUT ] param_name type   func_parameter:   param_name type   type:   Any valid MySQL data type   characteristic:   LANGUAGE SQL   | [NOT] DETERMINISTIC   | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }   | SQL SECURITY { DEFINER | INVOKER }   | COMMENT 'string'  routine_body:   Valid SQL procedure statement  

各参数说明见CREATE PROCEDURE and CREATE FUNCTION Syntax

DELIMITER $$   DROP FUNCTION IF EXISTS f_discount_price$$
CREATE FUNCTION f_discount_price   (normal_price NUMERIC(8,2))   RETURNS NUMERIC(8,2)   DETERMINISTIC
BEGIN   DECLARE discount_price NUMERIC(8,2);   IF (normal_price > 500) THEN   SET discount_price = normal_price * .8;   ELSEIF (normal_price >100) THEN   SET discount_price = normal_price * .9;   ELSE   SET discount_price = normal_price;   END IF;   RETURN(discount_price);
END$$   DELIMITER ;  

16. 触发器
触发器在INSERT、UPDATE或DELETE等DML语句修改数据库表时触发 
触发器的典型应用场景是重要的业务逻辑、提高性能、监控表的修改等 
触发器可以在DML语句执行前或后触发

DELIMITER $$   DROP TRIGGER sales_trigger$$
CREATE TRIGGER sales_trigger   BEFORE INSERT ON sales   FOR EACH ROW
BEGIN   IF NEW.sale_value > 500 THEN   SET NEW.free_shipping = 'Y';   ELSE   SET NEW.free_shipping = 'N';   END IF;   IF NEW.sale_value > 1000 THEN   SET NEW.discount = NEW.sale_value * .15;   ELSE   SET NEW.discount = 0;   END IF;
END$$   DELIMITER ;  

转自:http://fyb613.blog.163.com/blog/static/325460922010044417672/

转载于:https://www.cnblogs.com/xyxy/p/3886526.html

MySQL存储过程总结(二)相关推荐

  1. MySQL存储过程实战二:语法讲解。

    先展示一段完整的存储过程代码作为例子方便进行语法说明.代码如下: --##########定义课程分享量存储过程###################### delimiter $$ DROP PRO ...

  2. mysql存储过程实va_mysql-存储过程(二)-逻辑判断语句

    一,if语句: IF(expr1,expr2,expr3) 如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为e ...

  3. mysql存储过程语法及实例

    存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. --------------------基本语法-------------------- 一.创建存储过程 c ...

  4. mybatis mysql 存储过程_Mysql 存储过程+Mybatis调用实现插入操作例子 | 学步园

    一. 简介:网上关于存储过程的使用有很多的例子,但大多实现的功能比较简单,由于本人对SQL语句还不是很熟悉,更别说存储过程了,所以在实现该例子的时候遇到了很多问题,现在拿给大家来分享. 二. 在本例子 ...

  5. MySQL 存储过程初研究

    最近在做一个移动设备多类型登录的统一用户系统.其中记录用户资料的部分,因为涉及到更换设备的相同用户.同一个用户多类型同时具备的情况,所以想分辨出尽量少的用户去合理记录,就需要多次查询.于是决定研究一下 ...

  6. MySQL存储过程的创建及调用

    阅读目录:MySQL存储过程_创建-调用-参数 存储过程:SQL中的"脚本" 1.创建存储过程 2.调用存储过程 3.存储过程体 4.语句块标签 存储过程的参数 1.in:向过程里 ...

  7. MySQL 存储过程 经常使用语法

    MySQL 存储过程是从 MySQL 5.0 開始添加的新功能.存储过程的长处有一箩筐.只是最基本的还是运行效率和SQL 代码封装.特别是 SQL 代码封装功能,假设没有存储过程,在外部程序訪问数据库 ...

  8. jsp实现mysql存储过程_JSP调用MySQL存储过程收藏

    JSP调用MySQL存储过程收藏 1使用不带参数的存储过程 使用 JDBC 驱动程序调用不带参数的存储过程时,必须使用 call SQL 转义序列.不带参数的 call 转义序列的语法如下所示: {c ...

  9. mysql 动态传入表名 存储过程_面试再问MySQL存储过程和触发器就把这篇文章给他...

    Mysql存储过程及触发器trigger 存储过程 一.一个简单的存储过程 1,一个简单的存储过程 delimiter $$create procedure testa()begin Select * ...

  10. mysql存储过程 php_PHP调用MYSQL存储过程实例

    说一下 在PHP页面中调用MYSQL存储过程的方法 以下是几个例子 仅供参考 实例一:无参的存储过程 $conn = mysql_connect('localhost','root','root') ...

最新文章

  1. Domino Web开发规则之三:以资源管理库为中心开发
  2. 2021年要关注这5个开源Kubernetes项目
  3. windows php swoole 安装
  4. 从程序员到产品经理,我是如何成功转型的
  5. The world at your fingertips — 天涯明月刀幕后24(疏离)
  6. html中的form action属性,HTML form action 属性
  7. Linux系统有线网络抓包程序
  8. odoo10参考系列--ORM API 一(记录集、环境、通用方法和创建模型)
  9. Java程序员月薪三万,需要技术达到什么水平?
  10. 索引sql server_SQL Server索引设计的五个主要注意事项
  11. python编写骰子和的程序_简单掷骰子程序发行
  12. 《数字图像处理》--冈萨雷斯(第十章)
  13. 计算机软件能删除吗,怎么彻底清除电脑软件鲁大师?卸载对系统有影响吗?
  14. jQuery获取元素上一个、下一个、父元素、子元素
  15. ADSL后台初始密码大全
  16. Android 按两次返回键、长按返回键退出程序
  17. Java 20 超神版正式发布,展示了 Java 技术的最新进展
  18. 经常生气的人,身体有什么变化?
  19. 总是腰疼背痛 竟是“穿错鞋”惹的祸
  20. android 翻书动画效果怎么做,android ViewPager实现滑动翻页效果实例代码

热门文章

  1. CSS中Float概念相关文章
  2. (转)MySQL 服务器内存使用
  3. 【调查】您对计算机培训感兴趣吗?
  4. python 1033 旧键盘打字 (20 分)
  5. linux 安装tar 命令
  6. Mysql总结(二)
  7. Navicat和DBeaver的查询快捷键
  8. node.js 爬虫中文乱码 处理
  9. 【转】Linux查看物理CPU个数、核数、逻辑CPU个数
  10. Python 之路 Day5 - 常用模块学习