作为程序员一定要保持良好的睡眠,才能好编程

mysql中的变量以及存储过程 调用实例的演示

发布时间:2017-05-05

sql.txt

wb.txt

data.txt



http://blog.csdn.net/pleasurehappy/article/details/51087995


http://www.jb51.net/article/48475.htm



http://www.jb51.net/article/42906.htm



创建表格:

CREATE TABLE `netingcn_proc_test` (<br>
  `id` INTEGER(11) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(20),
  `password` VARCHAR(20),
  PRIMARY KEY (`id`)
)ENGINE=InnoDB;

engine=InnoDB; 这是存储引擎



同时插入多条语句:

insert into netingcn_proc_test(name, password) values
                ('procedure1', 'pass1'),
                ('procedure2', 'pass2'),
                ('procedure3', 'pass3'),
                ('procedure4', 'pass4');

如果是数组中的数据,就遍历成一条上面的语句,直接插入,这样节约资源



mysql中的函数和存储过程的区别在哪里?

函数可以使用return 返回数据,而存储过程不能使用return  其他的全部一样。


创建 函数的代码:把 procedure 改成 function 即可


delimiter $$
drop function if exists `cx` $$
create function cx()
begin
    declare i int;
    set i=1;
    while i<10000 DO     
     set i=i+1;
    end while;
    return i;
end $$



存储过程的语法:

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


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





在命令行中如何声明变量?

set @a=33;


读取变量:@a

select @a;  //33

select 3*@a;   //99





声明变量:

declare  id int(5)
declare tmpName varchar(30)


#连接字符串
set str= CONCAT(my_string,num,',');


以上这是声明,声明后边的参数和 创建表 写的参数是一样的。


mysql中不能直接赋值,需要使用 set 进行赋值。
set int =5;

每一条语句结束后,需要使用分号进行分割。



mysql中的判断语句:

if(id<5) then
    code....
end if;
if(id<5) then
    code...
elseif(id<10) then
    code2....
else
    code3...
end if;


if date_day is null then
  set date_day = date_add(now(),interval -1 day);
end if;




好的,现在看看case是如何使用的:


case varName
    when "1" then
        code...
    when "2" then
        code2...
    when "3" then
        code3...
end case;

mysql中如何循环?

循环有三种:


WHILE expression DO
    Statements;
END WHILE;



#这也是一种循环

REPEAT ... UNTIL condition  END REPEAT;
delimiter $$
drop procedure if exists `cx` $$
create procedure cx()
begin
    declare flag int default 0;
    declare i int;
    set i=1;
    REPEAT   
     insert into t(title)values(i);
     set i=i+1;
     if(i<10000) then
        set flag=1;
     end if;
    UNTIL flag=1 
    END REPEAT;
end $$





LOOP....END LOOP
或者
[loop_label]:LOOP   code...   END LOOP [loop_label]
使用if语句进行判断  离开这个循环  LEAVE [loop_label]

delimiter $$
drop procedure if exists `cx` $$
create procedure cx()
begin
    declare i int;
    set i=1;
    lp1:LOOP      
     insert into t(title)values(i);
     set i=i+1;
     if(i<10000) then
         LEAVE lp1;
     end if;
    end LOOP lp1;
end $$




while ... end while;

delimiter $$
drop procedure if exists `cx` $$
create procedure cx()
begin
    declare i int;
    set i=1;
    while i<10000 DO
     insert into t(title)values(i);
     set i=i+1;
    end while;
end $$



如何查看是怎么创建的这个存储过程?

show create procedure c42  \G

查看 c42这个存储过程是怎么创建的,会显示出整个创建的代码。



查看此数据中创建所有的存储过程:

show procedure status \G


删除一个存储过程:

drop procedure if exists  `c45` ;

如果c45这个存储过程存在,就删除



下面这段代码使用游标:


声明游标

DECLARE cur1 CURSOR FOR select id,title,brands from web_article where nav=42;

打开游标

 OPEN cur1

遍历游标

WHILE(tmpflat is not null)DO
    set sBrands=0;
    if(locate("米其林",tmpTitle)>0) then
        set sBrands=15;
    elseif(locate("普利司通",tmpTitle)>0) then
        set sBrands=16;     
    end if;
    update web_article set brands=sBrands where id=tmpId;    
    if(locate("轿车",tmpTitle)>0) then
        update web_article set tyrenet_type=1 where id=tmpId; 
    elseif(locate("卡客车",tmpTitle)>0) then
        update web_article set brands=3 where id=tmpId;
    end if;
    FETCH cur1 INTO tmpId,tmpTitle,tmpBrands;    
 END WHILE;

关闭游标

 CLOSE cur1;



这段代码的意思:读取表中的数据,然后遍历  判断是否属于此分类,并update 更新brands 这个参数。

delimiter $$
drop procedure if exists `c42` $$
create procedure c42()
begin
 DECLARE tmpflat INT DEFAULT 0; 
 DECLARE sBrands varchar(30) default "0";
 DECLARE tmpId int(4);
 DECLARE tmpTitle varchar(80);
 DECLARE tmpBrands varchar(80);
 DECLARE cur1 CURSOR FOR select id,title,brands from web_article where nav=42;
 DECLARE CONTINUE HANDLER FOR NOT FOUND SET tmpflat = null;
 OPEN cur1;
 FETCH cur1 INTO tmpId,tmpTitle,tmpBrands;
 WHILE(tmpflat is not null)DO
    set sBrands=0;
    if(locate("米其林",tmpTitle)>0) then
        set sBrands=15;
    elseif(locate("普利司通",tmpTitle)>0) then
        set sBrands=16;     
    end if;
    update web_article set brands=sBrands where id=tmpId;    
    if(locate("轿车",tmpTitle)>0) then
        update web_article set tyrenet_type=1 where id=tmpId; 
    elseif(locate("卡客车",tmpTitle)>0) then
        update web_article set brands=3 where id=tmpId;
    end if;
    FETCH cur1 INTO tmpId,tmpTitle,tmpBrands;    
 END WHILE;
 CLOSE cur1;
end $$
delimiter ;


存错过程中做的是事情就是一组语句,写在一起,调用的时候,执行以下即可,

比如说,更新  ,插入 等操作

看看下面的代码:

IF NOT _done THEN
    IF total > 0 THEN
        SELECT ordUID into uid FROM fightorder WHERE fightorder.alipayNo=parentId limit 1;#查询用户UID 
        #INSERT INTO test values(total,uid);
        UPDATE sysusers SET integral=integral+total WHERE sysusers.UID=uid;#新增积分      
     END IF;
END IF;