【原创】Mysql存储过程学习笔记1

来源:互联网 发布:做广告图片的软件 编辑:程序博客网 时间:2024/06/05 04:46
1.为什么选择存储过程:
    1.1 降低网络流量  
    1.2 处理需要检查、循环、多语句但没有用户交互的重复性任务
    1.3 可移植性好,因为与具体语言无关
2
    2.1选择分隔符
      mysql>DELIMITER //
         不使用“;”的原因是:存储过程中有许多语句,所以要选择一个不容易在程序中出现的分隔符
    2.2恢复分隔符
      mysql>Delimiter ;
3  显示存储过程内容:
    show create procedure proc_name;
  show procedure status; ---->列出所有的存储过程
  show function status;
  show table status;
4. 存储体的内容可以是任意数据库操作语句
   但不能有对例程都表操作的数据库操作语句
5. 调用: call p1();//
-------------------------------
6. Characteristics Clauses 特征子句
   6.1
      create procedure p2()
      Language sql                <--
      not deterministic           <--
      sql security definer        <--
      comment 'a Procedure'       <--
      select current_date,Rand() from t//
   language sql一般无用,只是指下面主本是由SQL语言所写,但是IBM的DB2需要这句,兼容性问题。
   not deterministic(不确定性) 是传递给系统的信息。
                     如上面主体中含有select 语句,那返回肯定是未知的。
                     因此称其 not deterministic
                     但Mysql内置的优化程序不会注意这个,至少现在不注意。
       sql security definer 在调用时检查创建过程用户的权限 。还有一个(sql security invoker)
                     如过程己经调用,则不再检查了。
                     而(invoker)则还需要检查!
7.Parameter 参数
    7.1 create procedure p5()...
    7.2 create procedure p5([in] name data-type)...
    7.3 create procedure p5(out name data-type)...
    7.4 create procedure p5(inout name data-type)...
8 设置一个变量 set @x=0
 in:     create procedure p5(p int) set @x=p//
      call p5(123)//
      select @x//  
 out:   create procedure p6(out p int)
       ->set p=-5//
        call p6(@y)
        select @y
 Compound Statements 复合语句:
    create procedure p7()
     begin
      set @a=5;
      set @b=5;
     insert into person values('lihua',21,'m','store@163.com')
     select name form person where age>@a*@b-10;
   end;//
9. Variables 变量
    declare a int;
    set a=5;
   变量一旦声明,就能在任何能使用会话变量、文字、列名的地方使用
10.   不会改变的sql_mode
mysql> set sql_mode='ansi' //
mysql> create procedure p3()select'a'||'b'//
mysql> set sql_mode=''//
mysql> call p3()//
              不会改变的不会改变的不会改变的不会改变的
+------------+
| 'a' || 'b' |
+------------+
| ab           |
+------------+
这说明:MYSQL 在过程创建时会自动保持运行环境。

(3) Example with DEFAULT clause 含有DEFAULT有例子
 CREATE PROCEDURE p10 ()
BEGIN
  DECLARE a, b INT DEFAULT 5;
  INSERT INTO t VALUES (a);
  SELECT s1 * a FROM t WHERE s1 >= b;
END; //
(5) Scope作用域:
   CREATE PROCEDURE p11 ()
    结果显示了过程能正常工作
BEGIN
 DECLARE x1 CHAR(5) DEFAULT 'outer';
 BEGIN
  DECLARE x1 CHAR(5) DEFAULT 'inner';
  SELECT x1;
  END;
 SELECT x1;
 END; //
内部高于外部
11. Conditions and IF-THEN-ELSE 条件式和IF-THEN-ELSE -end if;   (注意在endif后有分号)
12.CASE指令:
1.
drop procedure if exists p13//
CREATE PROCEDURE p13 (IN parameter1 INT)
BEGIN
   DECLARE variable1 INT;
   SET variable1 = parameter1 + 1;
   CASE variable1
    WHEN 0 THEN insert into person values('PP',11,'m','mm@163.com');
    WHEN 1 THEN insert into person values('MM',22,'f','ff@163.com');
    ELSE        insert into person values('ELSE',33,'el','else@163.com');
   END CASE;
END; //

13.Loops循环语句
    WHILE ... END WHILE
    LOOP ... END LOOP
    REPEAT ... END REPEAT
    GOTO
-----------------------
14.  WHILE ... END WHILE      执行前检查结果
CREATE PROCEDURE p14 ()
BEGIN
 DECLARE v INT;
 SET v = 0;
 WHILE v < 5 DO
  INSERT INTO t VALUES (v);
  SET v = v + 1;
 END WHILE;
END; //
          
PRIME:
drop procedure if exists pro_prime2//
   create procedure pro_prime2(in num int)
    begin
      declare i,j,x,y int default 0;
      select PRI_NUM into j from prime;
      select 'count ',j;
      while i<num do
         set x=2;
         pp1:while x<=sqrt(j) do
            if j%x=0 then
               set y=1;
               leave pp1;
            else
               set x=x+1;
            end if;
         end while;
         if y=1 then
           set y=0;
         else
           set i=i+1;
           insert into prime values(j);
         end if;
           set j=j+1;
      end while;
    end;//
--------------------------------------------
15. REPEAT ... END REPEAT  执行后检查结果,while是执行前。。。[注:UNTIL语句后面可以没有分号]
 CREATE PROCEDURE p15 ()
BEGIN
  DECLARE v INT;
  SET v = 0;
  REPEAT
   INSERT INTO t VALUES (v);
   SET v = v + 1;
   UNTIL v >= 5
  END REPEAT;
END; //
-----------------------
16. LOOP ... END LOOP
 CREATE PROCEDURE p16 ()
BEGIN
                          过程
      我们可以看到调用
  DECLARE v INT;
  SET v = 0;
  loop_label: LOOP
    INSERT INTO t VALUES (v);
    SET v = v + 1;
    IF v >= 5 THEN                <--利用if/leave退出loop循环
      LEAVE loop_label;
    END IF;
  END LOOP;
END; //
----------------------------------------------------------------
 |  可以在begin、while、repeat、loop语句前使用标号           |
----------------------------------------------------------------
 |  也可以在语句结束时使用标号,但并不十分有用,只是         |
 |  这是良好的编程习惯。方便他人阅读。 如:end while label1; |
----------------------------------------------------------------
ITERATE 迭代      如果目标是迭代语句的话,就必须用到leave 语句
它类似于C语言中的continue;
CREATE PROCEDURE p20 ()
BEGIN
 DECLARE v INT;
 SET v = 0;
 loop_label: LOOP
   IF v = 3 THEN
     SET v = v + 1;
     ITERATE loop_label;
     END IF;
   INSERT INTO t VALUES (v);
   SET v = v + 1;
   IF v >= 5 THEN
     LEAVE loop_label;
     END IF;
   END LOOP;
END; //
----------------------------------------
17. GOTO    [不推荐使用]
CREATE PROCEDURE p...
BEGIN
...
LABEL label_name;
...
GOTO label_name;
...
END;
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 情绪不好爱生气怎么办 心里每天烦躁该怎么办 心情低落想哭怎么办 心老是烦躁急怎么办 易烦躁睡眠不好怎么办 天气热心情烦躁怎么办 嘴巴里有溃疡怎么办 嘴巴里面反复烂怎么办 多处口腔溃烂怎么办 口腔黏膜破了怎么办 有鼻炎鼻子痒怎么办 感冒就清鼻涕怎么办 怀孕感冒流鼻涕打喷嚏怎么办 过敏性鼻炎打喷嚏流鼻涕怎么办 宝宝黄鼻涕鼻塞怎么办 鼻炎总是打喷嚏流鼻涕怎么办 新生儿流黄鼻涕怎么办 感冒鼻塞流鼻涕喷嚏怎么办 宝宝总是打喷嚏流鼻涕怎么办 不停的打喷嚏流鼻涕怎么办 宝宝不停打喷嚏流鼻涕怎么办 孕妇感冒流鼻涕打喷嚏怎么办 孕妇感冒咳嗽流鼻涕怎么办 鼻子痒流鼻涕流眼泪怎么办 天冷鼻子流鼻涕怎么办 感冒流水样鼻涕怎么办 一直有清水鼻涕怎么办 孩子总打喷嚏鼻塞怎么办 4岁儿童流鼻涕怎么办 孕妇清鼻涕不停怎么办 感冒流鼻水怎么办速效办法 一岁宝宝流清涕怎么办 咳嗽喉咙痛有痰怎么办 冻感冒了流鼻涕怎么办 吸烟经常嗓子疼怎么办 擦鼻涕擦破了怎么办 感冒鼻水流不停怎么办 流鼻涕鼻子都擦红了怎么办 鼻子不停的流水怎么办 擦鼻涕耳朵疼怎么办 鼻涕跟水一样怎么办