SQL存储过程

存储过程

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。

语法:

CREATE  PROCEDURE  过程名 ([[IN|OUT|INOUT] 参数名 数据类型

                      [,[IN|OUT|INOUT] 参数名 数据类型…]])

  BEGIN

      过程体

  END;

举例:

DELIMITER //

CREATE PROCEDURE myproc(OUT s int)   

 BEGIN        

SELECT COUNT(*) INTO s FROM students;

    END;

//DELIMITER ;

说明:

分隔符

      MySQL默认以";"为分隔符,如果没有声明分割符,则编译器会把存储过程当成SQL语句进行处理,因此编译过程会报错,所以要事先用“DELIMITER //”声明当前段分隔符,让编译器把两个"//"之间的内容当做存储过程的代码,不会执行这些代码;“DELIMITER ;”的意为把分隔符还原。

参数

      存储过程根据需要可能会有输入、输出、输入输出参数,如果有多个参数用","分割开。MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT:

      IN参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值 OUT:该值可在存储过程内部被改变,并可返回 INOUT:调用时指定,并且可被改变和返回。

过程体

      过程体的开始与结束使用BEGIN与END进行标识。

存储过程是一组SQL语句

增强SQL语言的功能和灵活性:

        存储过程可以用控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。

提升复用程度 :

        存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。

较快的执行速度:

        存储过程是预编译的。而批处理的SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。

减少网络流量:

      针对同一个数据库对象的操作,如果操作的SQL语句写在存储过程,当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大减少网络流量并降低了网络负载

调用存储过程

语法:

        CALL  precedure_name([param1,param2]…..)

举例:

        CALL  pr_add(10, 20);

用户定义变量 

MySQL存储过程中,定义变量有两种方式:

用户变量:

      使用SET或SELECT直接赋值,变量名以 @ 开头.

例如: SET @var=1;

        SELECT @var:=5;

        SELECT  empno,ename INTO @var,@name FROM EMP WHERE empno =7499 ;

可以在一个会话的任何地方声明,用户变量可以作用于当前整个连接,但是当前连接断开后,其所定义的用户变量都会消失称为用户变量。

局部变量:

    DECLARE 关键字声明的变量,只能在存储过程中使用,称为存储过程变量,

  格式:

DECLARE  varname1[,varname2] ……  datatype  [DEFAULT VALUE]

  例如:

DECLARE var1 INT DEFAULT 0;

DECLAR  v1,v2  VARCHAR(20);

SET C= 5; //赋值

SELECT  empno,empname INTO var1,v1  FROM emp WHERE empno =7499;

局部变量一般用在sql语句块中,比如存储过程的begin/end。其作用域仅限于该语句块,在该语句块执行完毕后,局部变量就消失了。

条件结构

If语句

①语法结构:

if    条件表达式1  then

语句块1;

end if;

说明:end if后必须以“;”结束

举例:

        DELIMITER //

        CREATE PROCEDURE pTest()

        BEGIN

              DECLARE vHour INT;

              SET vHour =10;

              IF vHour>40 THEN

                  SELECT '加班了';

              END IF;

        END//

        DELIMITER 

②语法结构:

if    条件表达式1  then

      语句块;

else 

语句块;

end if;

说明:end if后必须以“;”结束

举例:

        DELIMITER //

        CREATE PROCEDURE pTest()

           BEGIN

              DECLARE vHour INT;

              SET vHour =10;

              IF vHour>40 THEN

                  SELECT '加班了';

              ELSE

                  SELECT '没加班';

              END IF;

        END//

        DELIMITER 

③语法结构:

if    条件表达式1  then

      语句块1;

[elseif 条件表达式2  then

      语句块2] ...

[else  语句块n]

end if;

说明:end if后必须以“;”结束

举例:

        DELIMITER $$

        CREATE PROCEDURE pTest()

        BEGIN

              DECLARE vHour INT;

              SET vHour =60;

              IF vHour>70 THEN

                  SELECT '加班超多';

              ELSEIF vHour> 50 AND vHour<=70  THEN

                  SELECT '加班多';

              ELSEIF vHour >40 AND vHour<=50 THEN

                  SELECT '有加班';

              ELSE

                  SELECT '没加班';

              END IF;

        END$$

        DELIMITER ;

case语句

①语法结构:

case 表达式

  when value1 then  语句块1;

  when value2 then  语句块2;

    …

  else 语句块n;

end case;

举例:

        DELIMITER //

        CREATE PROCEDURE pCase()

          BEGIN

              DECLARE  job CHAR(50);

              SET job ='a';

              CASE job

              WHEN 'a' THEN SELECT '工作是经理';

              WHEN 'b' THEN SELECT '工作是财务';

              WHEN 'c' THEN SELECT '工作是人事';

              WHEN 'd' THEN SELECT '工作是行政';

              ELSE SELECT '是其它工作';

              END CASE;

        END;//

        DELIMITER 

②语法结构:

case 表达式

  when value1 then  语句块1;

  when value2 then  语句块2;

    …

  else 语句块n;

end case;

举例:

        DELIMITER //

        CREATE PROCEDURE pCase()

          BEGIN

              DECLARE  job CHAR(50);

              SET job ='a';

              CASE job

              WHEN 'a' THEN SELECT '工作是经理';

              WHEN 'b' THEN SELECT '工作是财务';

              WHEN 'c' THEN SELECT '工作是人事';

              WHEN 'd' THEN SELECT '工作是行政';

              ELSE SELECT '是其它工作';

              END CASE;

        END;//

        DELIMITER ;

③语法结构:

case

  when 表达式1  then  语句块1;

  when 表达式2  then  语句块2;

    …

  else 语句块n;

end case;

举例:

        DELIMITER //

        CREATE PROCEDURE pCase2()

          BEGIN

              DECLARE vNum CHAR(20);

              SET vNum = 80;

              CASE

        WHEN vNum IS NULL THEN SELECT '没有分数';

        WHEN vNum>90 THEN SELECT '成绩优异';

        WHEN vNum<90 AND vNum>=60 THEN SELECT '成绩良';

        ELSE SELECT '没有及格';

              END CASE;

        END;//

        DELIMITER ;

循环结构

MySQL提供了三种循环语句:

    While

    Loop

    Repeat

除此以外,MySQL还提供了iterate语句以及leave语句用于循环的控制。

while语句结构:

while    条件表达式    do

      循环体;

end while ;

说明:

1)end while后必须以“;”结束

2)当条件表达式的值为true时,反复执行循环体

    ,直到条件表达式的值为false

语法结构:

        DELIMITER //

        CREATE  PROCEDURE pWhile()

        BEGIN

             DECLARE vNum INT;

              SET vNum = 0;

              WHILE vNum<20 DO

        SET vNum= vNum + 1;

              END WHILE;

            SELECT vNum;

        END;//

        DELIMITER ;

Loop循环格式:

[循环标签:] loop

  循环体;

  if 条件表达式 then 

      leave [循环标签];

  end if;

end loop;

说明:end loop后必须以“;”结束

        DELIMITER //

        CREATE  PROCEDURE pLoop()

        BEGIN

              DECLARE vNum INT;

              SET vNum = 0;

              addLoop:LOOP

        IF vNum>20 THEN

          LEAVE addLoop;

        END IF;

        SET vNum= vNum + 1;

              END LOOP addloop;

            SELECT vNum;

        END;//

        DELIMITER ;

Leave关键字:用于跳出当前的循环语句(例如while语句)

  语法格式如下:

      leave 循环标签;

  说明:leave 循环标签后必须以“;”结束

Iterate关键字:用于跳出本次循环,继而进行下次循环。

  语法格式:

        Iterate 循环标签;

    说明:iterate循环标签后必须以“;”结束

Iterate语句:

        DELIMITER //

        CREATE  PROCEDURE piterate()

        BEGIN

              DECLARE vNum INT;

              SET vNum = 0;

              addLoop:LOOP

                SET vNum= vNum + 1;

                IF vNum<10 THEN ITERATE addloop;

                ELSEIF vNum>20 THEN LEAVE addloop;

        END IF;

        SELECT 'vnum <=0 and vnum >=10';

              END LOOP addloop;

            SELECT vNum;

        END;//

        DELIMITER ;

repeat语句:

  当条件表达式的值为false时,反复执行循环,

    直到条件表达式的值为true

[循环标签:]repeat

    循环体;

    until 条件表达式

end repeat [循环标签];

说明:end repeat后必须以“;”结束

        DELIMITER //

        CREATE  PROCEDURE prepeat()

        BEGIN

              DECLARE vNum INT;

              SET vNum = 0;

              addrepeat:REPEAT

                SET vNum= vNum + 1;

        UNTIL vNum>20

              END REPEAT addrepeat;

            SELECT vNum;

        END;//

        DELIMITER ;

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

推荐阅读更多精彩内容