mysql存储过程和常用流程控制

  1 /*
  2 该代码是创建了一个名叫"p4"的存储过程并设置了s1,s2,s3两个int型一个varchar型参数,还可以是其他数据类型,内部创建了x1,x2两个变量
  3 
  4 DELIMITER是修改分隔符的
  5 DELIMITER $$的意思是把默认分隔符";"换成"$$",这样分段写的存储过程就能整个被执行,而不是被当成多条sql语句单独执行
  6 创建完过程再将分隔符改回成";"
  7 
  8 两种创建变量并赋值的方式
  9 SET @变量名 = 值;
 10 SELECT 值 INTO @变量名;
 11 使用变量前必须先运行该变量赋值语句
 12 过程内部还可以通过 "DECLARE 变量名 类型(字符串型要加范围) DEFAULT 值;" 来创建变量,但如此创建的变量只能在该过程内部访问
 13 
 14 存储过程只有三种类型参数 IN,OUT,INOUT
 15 调用过程时过程有几个参数传几个参数,只是IN型的参数可以传的是变量,可以是常量,而OUT和INOUT型的参数传的必须是变量
 16 传给out,inout参数的变量值会随着在过程中改变在外部也改变,而给in参数的变量外部值则不受过程内变量值改变的影响
 17 */
 18 DELIMITER $$
 19 
 20 DROP PROCEDURE IF EXISTS `p4`$$
 21 
 22 CREATE PROCEDURE `p4`(IN s1 INT,OUT s2 INT,INOUT s3 VARCHAR(10))
 23 BEGIN
 24 DECLARE x1 VARCHAR(10) DEFAULT 'this is x1'; 
 25 DECLARE x2 VARCHAR(10) DEFAULT 'this is x2'; 
 26 SET s1 = 11;
 27 SET s2 = 22;
 28 SET s3 = 'iss3';
 29 
 30 /*
 31 if语法
 32 */
 33 IF s1 = 11 AND s2 = 12 THEN
 34 SELECT s1,s2;
 35 END IF;
 36 
 37 IF s3 = 's3' OR s1 = s2 THEN
 38 SELECT s3;
 39 ELSE 
 40 SELECT s1,s2,s3;
 41 END IF;
 42 
 43 /*
 44 case语法
 45 */
 46 CASE s3
 47 WHEN 's1' THEN
 48 SELECT 'this is s1';
 49 WHEN 's2' THEN
 50 SELECT 'this is s2';
 51 ELSE
 52 SELECT 'this is s3';
 53 END CASE;
 54 
 55 /*
 56 while循环
 57 */
 58 WHILE s1>1 DO
 59 SET s1=s1-1;
 60 END WHILE; 
 61 SELECT s1;
 62 
 63 /*
 64 repeat循环语句
 65 与while不同的是while满足条件就执行,repeat始终执行直到满足条件终止
 66 */
 67 REPEAT  
 68 SET s1 = s1-1; 
 69 UNTIL s1=1  
 70 END REPEAT; 
 71 SELECT s1;
 72 
 73 
 74 /*
 75 LOOP循环
 76 LOOP没有循环条件,会不停的循环直到遇到 "LEAVE ZiDingYi;" "ZiDingYi"是自定义的LOOP标记
 77 */
 78 ZiDingYi:LOOP
 79 SET s1 = s1+1;
 80 IF s1 = 5 THEN
 81 LEAVE ZiDingYi;
 82 END IF;
 83 END LOOP;
 84 SELECT s1;
 85 
 86 
 87 END$$
 88 
 89 DELIMITER ;
 90 
 91 
 92 SET @p_in=1; 
 93 SET @p_out=2;
 94 SET @p_inout = 's3';
 95 SELECT 'Hello World1' INTO @p_4;
 96 
 97 /*调用存储过程*/
 98 CALL p4(@p_in,@p_out,@p_inout);
 99 SELECT @p_in,@p_out,@p_inout,@p_4;
100 
101 
102 /*
103 存储过程如果只有一个语句则语句不用 begin...end包围
104 存储过程中可以直接使用外部定义的变量
105 存储过程中用set和select定义的变量就是全局的,执行该过程后内部用set和select定义的变量外部可以访问,其他过程也可以直接使用
106 */
107 CREATE PROCEDURE p1()   SET @var='p1';  
108 CREATE PROCEDURE p2() SELECT CONCAT('Last procedure was ',@var);  
109 CALL p1();  
110 CALL p2(); 
111 SELECT @var;
112 
113 CREATE PROCEDURE p3() SELECT CONCAT(@p3_var,' World');
114 SET @p3_var='Hello';
115 CALL p3();
116 
117 /*删除存储过程*/
118 DROP PROCEDURE p4;
119 /*或者*/
120 DROP PROCEDURE IF EXISTS `p4`
121 
122 /*查看该数据库下有哪些存储过程 test为数据库名*/
123 SELECT NAME FROM mysql.proc WHERE db='test';
124 /*或者*/
125 SHOW PROCEDURE STATUS WHERE db='test';
126 
127 /*查看存储过程详细信息,包括创建语句*/
128 SHOW CREATE PROCEDURE p4;

 

posted @ 2017-10-19 16:49  戈博折刀  阅读(243)  评论(0编辑  收藏  举报