MYSQL存储过程怎么写

MySQL存储过程

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

  3,变量

  DECLARE声明,SET赋值

可以在DECLARE变量时用DEFAULT设置默认值,不设则为NULL

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

  4,参数

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

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

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

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

    5,条件判断

IF THEN、ELSEIF、ELSE、END 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 ;

6,循环

LOOP、END LOOP

代码

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 ;

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 ;

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 ;

7,异常处理

如果用cursor获取SELECT语句返回的所有结果集时应该定义NOT FOUND error handler来防止存储程序提前终结

如果SQL语句可能返回constraint violation等错误时应该创建一个handler来防止程序终结

8,数据库交互

INTO用于存储单行记录的查询结果

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

  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 ;

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 ;

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 ;

  9,使用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 ;

  10,一个复杂的例子

代码

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;

  11,存储方法

存储方法与存储过程的区别

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 ;

   12,触发器

触发器在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 ;

MYSQL存储过程怎么写

时间: 2024-10-09 21:26:32

MYSQL存储过程怎么写的相关文章

mysql写存储过程/PHP写和调用存储过程

PHP调用MYSQL存储过程实例 来源: http://blog.csdn.net/ewing333/article/details/5906887 实例一:无参的存储过程 $conn = mysql_connect('localhost','root','root') or die ("数据连接错误!!!"); mysql_select_db('test',$conn); $sql = " create procedure myproce() begin INSERT IN

MySQL存储过程详解 mysql 存储过程

MySQL存储过程详解  mysql 存储过程 (2010-12-13 10:59:38) 转载▼ 标签: it 分类: mysql mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保

MYSQL存储过程和函数学习笔记

学至Tarena金牌讲师何山,金色晨曦科技公司技术总监沙利穆课程笔记的综合. 1. 什么是存储过程和函数 将SQL语句放入一个集合里,然后直接调用存储过程和函数来执行已经定义好的SQL语句,通过存储过程和函数,可以避免开发人员重复编写相同的SQL语句. MYSQL存储过程和函数是保存在服务器中,在服务器中存储和执行,可以减少客户端和服务器端之间数据传输的消耗. 存储过程就是一组已经保存在数据库中的语句,并且可以随时地调用. 存储过程允许标准组件式编程,存储过程在被创建以后可以在程序中被多次调用而

MySQL存储过程详解 mysql 存储过程(转:http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html)

转:http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和

mysql存储过程详解

1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和一些特殊的控制结构组成.当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的.数据库中的存储过程可以

PHP多次调用Mysql存储过程报错解决办法

PHP多次调用Mysql数据库的存储过程会出现问题,主要问题为存储过程中执行多次SQL语句不能一一释放导致的,网上找了一些解决办法,比如使用 multi_query 然后一个一个释放,但是发现根本不适合我们的项目,我们使用CI框架写的,更多的是使用CI的数据库处理方法.所以只能另辟蹊径. 一次偶然,把Mysql链接方式改成了mysqli,两种不同的PHP连接mysql的扩展,官方在高版本中推荐使用mysqli,结果却奇迹般好了,使用Mysql长连接也行,天意么? PHP多次调用Mysql存储过程

Mysql存储过程(转)

一.MySQL 创建存储过程 "pr_add" 是个简单的 MySQL 存储过程,这个存储过程有两个 int 类型的输入参数 "a"."b",返回这两个参数的和. drop procedure if exists pr_add; -- 计算两个数之和 create procedure pr_add(   a int,   b int)begin   declare c int; if a is null then      set a = 0; 

mysql存储过程编写-入门案例-遁地龙卷风

(-1)写在前面 这篇文章只是简要的叙述了mysql存储过程编写的基本概念. 我使用的mysql版本是5.7.9-log. 参照<<深入浅出MySQL>>. (0) delimiter // delimiter //中的//可以指定为别的符号,比如delimiter @@,改变语句的结束的标识. 因为在存储过程中用到了;,不改变默认语句结束.标识将会报错. 创建完存储过程后别忘了自己更改过默认结束标识哦! (1)存储过程的创建 在mysql命令行工具输入如下代码,当然你也可以在可视

mysql存储过程详细教程

记录mysql存储过程中的关键语法:DELIMITER //  声明语句结束符,用于区分;CREATE PROCEDURE demo_in_parameter(IN p_in int)  声明存储过程BEGIN .... END  存储过程开始和结束符号SET @p_in=1   变量赋值 DECLARE l_int int unsigned default 4000000;  变量定义 什么是mysql存储例程? 存储例程是存储在数据库服务器中的一组sql语句,通过在查询中调用一个指定的名称来