• 存储过程


    #存储过程:mysql5.0以上。将sql以函数的形式存储起来共调用,极大地提高了数据库的处理速度,同时提高了数据库编程的灵活性。
    
    #定界符,防止被mysql当成sql语句处理
    DELIMITER //
    	create procedure demo()#函数名
    	begin	#过程体的开始与结束使用begin与end进行标识
    		select * from 表名
    	end	
    // DELIMITER ;
    
    #用户变量:::凡是带有@的都属于用户变量,使用用户变量要先set @user = '';,否则null;查询用户变量select @user;注意,滥用用户变量易导致程序难以理解或管理。
    #注释:::--单行;/****/多行注释;
    #过程函数参数:::IN/OUT/INOUT 参数名 类型(为mysql字段类型)
    
    DELIMITER //
     create procedure demo()
    		BEGIN
    			select * from sp_user;
    		END
    		// 
    DELIMITER;		
    
    #调用
    CALL demo();
    
    #获取数据的全部存储过程
    select * from information_schema.ROUTINES;
    select * from information_schema.ROUTINES where specific_name = 'in_param';
    
    #in
    DELIMITER //
      CREATE PROCEDURE in_param(IN p_in int)
        BEGIN
        SELECT p_in;
        SET p_in=2;
        SELECT p_in;
        END;
        //
    DELIMITER ;
    drop procedure in_param;
    #调用
    SET @p_in=1;
    CALL in_param(@p_in);
    SELECT @p_in;
    
    #out
    DELIMITER //
    	CREATE PROCEDURE out_param(OUT p_out int)
    		BEGIN
    		SELECT p_out;
    		set p_out=2;
    		select p_out;
    		END
    // DELIMITER;		
    #调用
    SET @p_out=1;
    CALL out_param(@p_out);
    SELECT @p_out;
    
    #inout
    DELIMITER //
    	CREATE PROCEDURE inout_param(INOUT p_inout int)
    		BEGIN
    			SELECT p_inout;
    			SET p_inout=2;
    			SELECT p_inout;
    		END
    	// 
    DELIMITER;		
    drop PROCEDURE inout_param;
    #调用
    SET @p_inout=1;
    CALL inout_param(@p_inout) ;
    SELECT @p_inout;
    
    SELECT 'Hello World' into @x;
    SELECT @x;
    SET @y='Goodbye Cruel World';
    SELECT @y;
    SET @z=1+2+3;
    SELECT @z;
    
    
    
    #IN/OUT/INPUT参数
    #试例1,简单调用(OUT)。实现调用存储过程时,传入 user_id 返回改用户的user_name
    drop PROCEDURE out_demo;
    DELIMITER //
     create procedure out_demo(IN my_user_id varchar(32),OUT user_name varchar(32))
    		BEGIN
    			select name into user_name from Watcher where id = my_user_id;
    			select user_name;
    		END
    		// 
    DELIMITER;	
    #试例1调用方法:
    CALL shoufuyou_statistics.out_demo('5',@user_name);
    
    #试例2,简单调用(IN)。实现调用存储过程时,传入 user_id 返回改用户的user_name
    drop PROCEDURE in_demo;
    DELIMITER //
     create procedure in_demo(IN my_user_id varchar(32))
    		BEGIN
    			declare user_name varchar(32) default '';#因参数中不含有此变量,故须要声明declare
    			select name into user_name from Watcher where id = my_user_id;
    			select user_name;
    		END
    		// 
    DELIMITER;	
    #试例2调用方法:
    CALL shoufuyou_statistics.in_demo('5');
    
    #试例3,简单调用(INOUT)。实现调用存储过程时,传入 user_id 返回改用户的user_name
    drop PROCEDURE inout_demo;
    DELIMITER //
     create procedure inout_demo(INOUT my_user_id varchar(32),INOUT user_name varchar(32))
    		BEGIN
    			set my_user_id = '5';
    			set user_name = '易君强';
    			select id,name into my_user_id,user_name from Watcher where id = my_user_id;
    			select my_user_id,user_name;
    		END
    		// 
    DELIMITER;	
    #试例3调用方法:
    call inout_demo(@my_user_id,@user_name);#正确
    call inout_demo('6',@user_name);#错误
    
    
    
    ###变量作用域  由上自下
    DELIMITER //  
    	CREATE PROCEDURE default_demo()  
    		begin 
    			declare x1 varchar(5) default 'outer';  
    		begin 
    		declare x1 varchar(5) default 'inner';  
    			select x1;  
    		end;  
    			select x1;  
    		end;  
    	//  
    DELIMITER ;  
    call default_demo();
    
    ###条件语句  
    #1.if-then-else
    delimiter $$
    	create procedure if_demo(IN parameter int)  
    		begin 
    			declare var int;
    			set var = parameter * 1;
    			if var = 2 then 
    				insert into demo value(3,17);#向表demo中添加信息,注意表的字段数量
    			end if;
    			if parameter = 0 then 
    				update demo set user_email = user_email + 1;#修改表demo的字段user_email值为自身+1
    			else 
    				update demo set user_email = user_email + 2;#修改表demo的字段user_email值为自身+2
    			end if;
    		end;
    		$$
    delimiter;		
    call if_demo(2);#调用
    
    #2.case语句
    DELIMITER //  
    	CREATE PROCEDURE case_demo (in parameter int)  
    		begin 
    			declare var int;  
    			set var = parameter + 1;  
    		case var  
    		when 0 then   
    			insert into demo (user_email)values(17);  
    		when 1 then   
    			insert into demo (user_email)values(18);  
    		else   
    			insert into demo (user_email)values(19);  
    		end case;  
    	end;  
    	//  
    DELIMITER ; 
    call case_demo(-1);
    
    ###循环语句
    #1.while...end while	特点是执行操作前检查结果
    DELIMITER //  
    	CREATE PROCEDURE while_demo()  
    		begin 
    			declare var int;  
    			set var = 0;  
    			while var < 6 do  
    				insert into demo (user_email)values(var);  
    			set var = var + 1;  
    		end while;  
    	end;  
    	//  
    DELIMITER ; 
    call while_demo();
    
    #2.repeat···· end repeat  特点是执行操作后检查结果,与do..while类似
    DELIMITER //  
    	CREATE PROCEDURE repeat_demo()  
    		begin   
    			declare v int;  
    			set v = 0;  
    			repeat  
    				insert into demo (user_email)values(v);  
    				set v = v + 1;  
    				until v >= 5  
    			end repeat;  
    		end;  
    	//  
    DELIMITER ;  
    call repeat_demo();
    
    #3.LOOP...END LOOP
    DELIMITER //
    drop function if exists loop_demo;
      CREATE PROCEDURE loop_demo()
        begin
          declare v int;
          set v = 0;
          LOOP_LABLE:LOOP
            insert into demo (user_email)VALUES(v);
            set v = v + 1;
            if v >= 5 then
              LEAVE LOOP_LABLE;#类似于break,满足条件就跳出
            end if;
          END LOOP;
        end;
      //
    DELIMITER ;
    call loop_demo();
    
    #3.LOOP...END LOOP--demo---在MySQL中用函数实现在字符串一后面循环拼接n个字符串二
    delimiter $$
    drop function if exists fun_addStr;
    create function fun_addStr(str1 varchar(100),str2 varchar(10),num int) returns varchar(200)
    begin
        declare i int default 1;
        declare result varchar(200) default '';
        set result = str1;
        myloop:loop
            set i = i + 1;
            set result = concat(result,str2);
            if i > num then
    					leave myloop;
            end if;
        end loop myloop; 
        return result;
    end $$
    delimiter;
    select fun_addStr('字符串一','字符串二',3);
    
    #迭代
    #ITERATE	通过引用复合语句的标号,来从新开始复合语句
    DELIMITER //
      CREATE PROCEDURE iterate_demo()
      begin
        declare v int;
        set v = 0;
        LOOP_LABLE:LOOP
          if v = 3 then
            set v = v + 1;
            ITERATE LOOP_LABLE;
          end if;
          insert into demo (user_email)VALUES(v);
          set v = v + 1;
          if v >= 5 then
            LEAVE LOOP_LABLE;
          end if;
        END LOOP;
      end;
      //
    DELIMITER ;
    call iterate_demo();
    

      例子,通过存储过程向数据表中添加指定数量信息。

    delimiter ;;
    create procedure idata()
    begin
      declare i int;
      set i=1;
      while(i<=100000)do
        insert into t values(i, i, i);
        set i=i+1;
      end while;
    end;;
    delimiter ;
    call idata();
  • 相关阅读:
    PHP ftp_rmdir() 函数
    PHP ftp_rename() 函数
    PHP ftp_rawlist() 函数
    PHP ftp_raw() 函数
    PHP ftp_pwd() 函数
    PHP ftp_put() 函数
    PHP ftp_pasv() 函数
    PHP ftp_nlist() 函数
    PHP ftp_nb_get() 函数
    PHP ftp_nb_fget() 函数
  • 原文地址:https://www.cnblogs.com/two-bees/p/10450468.html
Copyright © 2020-2023  润新知