mysql 存储过程小记

2019-08-27  本文已影响0人  落羽归尘
语法
CREATE
    [DEFINER = { user | CURRENT_USER }]
 PROCEDURE sp_name ([proc_parameter[,...]])
    [characteristic ...] routine_body
 
proc_parameter:
    [ IN | OUT | INOUT ] param_name type
 
characteristic:
    COMMENT 'string'
  | LANGUAGE SQL
  | [NOT] DETERMINISTIC
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }
 
routine_body:
  Valid SQL routine statement
 
[begin_label:] BEGIN
  [statement_list]
    ……
END [end_label]

下面先看一个存储过程的例子:

DROP PROCEDURE IF EXISTS `SP_day_history_value_summary`;
delimiter ;;
CREATE DEFINER=`Qi`@`%` PROCEDURE `SP_day_history_value_summary`(IN calcdate_offset int)
    COMMENT '用户计算'
BEGIN

    DECLARE _uid varchar(100);
    DECLARE _value decimal(20, 3);

    BEGIN
      DECLARE _stop_flag INT DEFAULT 0;
      DECLARE _Cursor CURSOR FOR
        select u.uid                                                                                 as `uid`,
               sum(admob_value / 100.0) + sum(facebook_value / 100.0) + sum(bat_value / 100.0) + sum(mobvista_value / 100.0) +
               sum(applovin_value / 100.0) +
               sum(fyber_coins * fyber_ratio / 10000.0) + sum(pollfish_coins * pollfish_ratio / 10000.0) as `value`
        from users_active u
               inner join (select uid from users_active where act_time = date(ADDDATE(NOW(), INTERVAL calcdate_offset DAY))) a
                 on a.uid = u.uid
        group by u.uid;
      DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET _stop_flag = 1;

      OPEN _Cursor;
      FETCH _Cursor
      INTO _uid, _value;

      WHILE _stop_flag <> 1 DO
        update users set value = _value where uid = _uid;

        FETCH _Cursor
        INTO _uid, _value;
      END WHILE;
      CLOSE _Cursor;
    END;


    CALL SP_LogCallDebug('end.');

  END;
;;
delimiter ;

我们先来一步一步讲解这个例子:

传参IN OUT INOUT

mysql> delimiter $$
mysql> create procedure in_param(in p_in int)
    -> begin
    ->   select p_in;
    ->   set p_in=2;
    ->    select P_in;
    -> end$$
mysql> delimiter ;

mysql> set @p_in=1;

mysql> call in_param(@p_in);
+------+
| p_in |
+------+
|    1 |
+------+

+------+
| P_in |
+------+
|    2 |
+------+

mysql> select @p_in;
+-------+
| @p_in |
+-------+
|     1 |
+-------+

以上可以看出,p_in在存储过程中被修改,但并不影响@p_id的值,因为前者为局部变量、后者为全局变量。

变量
create procedure getMsg  
()  
Begin 
declare v_title varchar(30);  
declare v_content varchar(100);  
select title,content into v_title,v_content from news where artId=333;  
End  
  1. declare用来定义局部变量
  2. @用来定义会话变量
上一篇下一篇

猜你喜欢

热点阅读