SQL编程语法

声明变量:

语法:declare var_name[,...] type [default value]
说明:这个语句被用来声明局部变量。要给变量提供一个默认值,需要包含一个default子句。值可以被指定为一个表达式,不需要为一个常数。如果没有default子句,初始值为null。局部变量的作用范围在它被声明的begin ... end块内。它可以被用在嵌套的块中,除了那些用相同名字声明变量的块。
ex:

declare a int default 0;
declare b int default 1;
declare c,d int;
变量赋值
  • set语句:
    语法:set var_name = expr [, var_name = expr] ...
    说明:也可以用语句代替set来为用户变量分配一个值。在这种情况下,分配符必须为:=而不能用=,因为在非set语句中=被视为一个比较 操作符
    ex:
set @a=0,@b=0,@c=0;
或
select @a:=1,@b:=2,@c:=3; 

ps:对于使用select语句为变量赋值的情况,若返回结果为空,即没有记录,此时变量的值为上一次变量赋值时的值,如果没有对变量赋过值,则为null。

  • select... into语句
    语法:select col_name[,...] into var_name[,...] table_expr
    说明:这个select语法把选定的列直接存储到变量。因此,只有单一的行可以被取回。
    ex:
select id,name into x,y from user limit 1;
begin...end复合语句

语法:
[begin_label:] begin
[statement_list]
end [end_label]
说明:存储子程序可以使用begin... end复合语句来包含多个语句。statement_list 代表一个或多个语句的列表。statement_list之内每个语句都必须用分号(;)来结尾。 复合语句可以被标记。除非begin_label存在,否则end_label不能被给出,并且如果二者都存在,他们必须是同样的
ex:

\\ begin
    declare a int default 1;
    declare b int default 4;
    declare c int;
    if a+b == 5 then
        c = a+b;
    end if;
  end//
流程控制结构
  • if语句
    语法:
    if search_condition then
    statement_list
    [else if search_condition then
    statement_list] ...
    [else statement_list]
    end if
    说明:statement_list可以包括一个或多个语句。
    ex:
delimiter //
create procedure test(in inparameter int)
begin
      declare a int;
      set a = inparameter + 1;
      if a = 0 then
         .......;
      end if;
      if inparameter = 0 then
          .......;
      else
          .......;
     end if;
end; //
delimiter ;
  • case语句
    语法:
    case case_value
    when when_value then statement_list
    [when when_value then statement_list] ...
    [else statement_list]
    end case
    或者:
    case
    when search_condition then statement_list
    [when search_condition then statement_list] ...
    [else statement_list]
    end case
    ex:
create procedure test2 (in parameter1 int)
begin
     declare a int;
     set a = parameter1 + 1;
     case a
          when 0 then insert into  t values(166);
          when 1 then insert into t values(158);
          else insert into t values(198);
     end case;
end; 
  • 循环语句
    语法:
    while… end while
    loop… end loop
    repeat… end repeat
    说明:在循环中还穿插一些循环控制语句,如leave(类似Java语言的break)、iterate(类似java语言的continue)等。
    leave语句
    leave label 这个语句被用来退出任何被标注的流程控制构造。它和begin... end或循环一起被使用。
    iterate语句
    iterate label iterate只可以出现在loop, repeat, 和while语句内。iterate意思为:再次循环。
    ps:iterate 跟Java语言中的迭代器不同含义
    while… end while ex:
create procedure test3 ()
begin
     declare a int;
     set a = 0;
     while a < 5 do
           set a = a + 1;
      end while;
end; 

loop … end loop ex:

create procedure test4 ()
begin
     declare a int;
     set a = 0;
     loop_label: loop
         set a = a + 1;
         if a >= 5 then
             leave loop_label;
         end if;
    end loop;
end; 

ps:loop允许某特定语句或语句群的重复执行,实现一个简单的循环构造。在循环内的语句一直重复直到循环被退出,退出通常伴随着一个leave 语句。
repeat … end repeat ex:

create procedure test5 ()
begin
     declare a int;
     set a = 0;
     repeat
          set a = a + 1;
     until a >= 5 end repeat;
end; 

迭代(ITERATE)语句ex:

create procedure test6 ()
begin
     declare a int;
     set a = 0;
     loop_label: loop
         if a = 3 then
             set a = a + 1;
             iterate loop_label;
         end if;
         set a = a + 1;
         if a >= 5 then
             leave loop_label;
         end if;
     end loop;
end; 
条件和异常处理程序:

语法:
declare handler_type handle for condition_value[,...] sp_statement
handler_type:
continue | exit | undo
condition_value:
SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION

说明:这个语句指定每个可以处理一个或多个条件的处理程序。如果产生一个或多个条件,指定的语句被执行。
对一个CONTINUE处理程序,当前子程序的执行在执行处理程序语句之后继续。对于EXIT处理程序,当前BEGIN...END复合语句的执行被终止。UNDO 处理程序类型语句还不被支持。
SQLWARNING是对所有以01开头的SQLSTATE代码的速记。
NOT FOUND是对所有以02开头的SQLSTATE代码的速记。
SQLEXCEPTION是对所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATE代码的速记。

声明自定义条件:

语法:declare condition_name condition for condition_value
condition_value:
SQLSTATE [VALUE] sqlstate_value
ex:

create table test (s1 int,primary key (s1));
delimiter //
create procedure handlerdemo ()
begin
     declare continue handle for SQLSTATE '23000' SET @x = 3; 
     set @x = 1;
     insert into test values(1);
     set @x = 2;
     insert into test values(2);
     set @x = 3;
end;//
delimiter ;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269