在linux中建立mysql存储过程


之前在项目上遇到一个问题,实施人员在数据库中建了许多临时的测试数据,在正式客户环境中是要删掉的,但是产品页面上没有删除选项,只能手动在数据库中删除。不仅数据多,而且表之间关系复杂,一条一条删除估计客户的黄花菜都凉了。所以就有了这篇文章,记录存储过程的一些语法,也便于大家参考。

什么是存储过程?

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

说的直白一点就是,存储过程是一组特定功能sql的集合,第一次编译后无需再编译,后续需要时直接调用即可。

所以这个时候存储过程就派上了用场。

在linux怎么创建存储过程

先来看一个最简单的存储过程示例

create procedure demo()
begin
    select id, name from user;
    update user set age = 20 where name = 'zhangsan';
end

这个存储过程的名称就是demo,功能就是查出user表中所有的id和name,并把张三的年龄改为20,存储过程中的sql集合就写在begin...end之间

第一次在linux命令行中执行上述操作,可能都会报如下的错



告诉你第三行有语法错误,那是因为mysql认为你的语句到第一个 ; 就结束了,所以存储过程创建失败。对上述语句做如下改动

delimiter //
create procedure demo()
begin
    select id, name from user;
    update user set age = 20 where name = 'zhangsan';
end
//

第一行的作用就是把mysql默认分隔符改为//(当然你可以改为其他符号比如@,$等,但是不要改成 * 等中间语句会用到的),读到 // 时mysql才会认为一个完整语句结束

最后要记得创建完存储过程后,要执行 delimiter ;

存储过程常用语法

代码清单1

delimiter //
create procedure demo1(
    in input int,
    out output int,
    inout param int
)
begin
    declare num int default 0;
    set output = 0;
    select age into @myage from user where id = input;

    if @myage = 20 then
        set output = 200;
        set num = 2;
    elseif @myage = 21 then
        set output = 300;
        set num = 3;
    else
        set output = 400;
        set num = 4;
    end if;
    
    while param < num do
        set param = param + 10;
    end while;
end//
delimiter ;

# 给inout类型变量赋初值
set @param = 1;
# 调用存储过程
call demo1(3, @myout, @param);

# 查看变量值和结果
select @myage;
select @myout;
select @param;
  • 参数
    存储过程的参数有3种:in,out,inout
    • in 是入参标识,input是变量名称,int代表类型
      输入参数传对应类型的值即可(当然也可以传递一个赋值后的变量)
    • out 代表输出参数,你可以理解为方法的返回值
      输出参数需要传变量,且要加上@
    • inout 代表输入输出变量,即你把一个变量输入,处理后再输出
      inout类型和out一样,也是传变量,但是需要先对变量赋值
三种参数调用方式
  • 变量声明和赋值

    声明

    • declare
      用declare声明变量,需要指明变量类型,后续可以直接使用变量名,详见代码清单1
    • @
      变量名前面加@表示声明为变量,而后续使用该变量也需要加上@符号,详见代码清单1

    赋值

    set @myage = 20;
    # 直接set一个值
    
    select age into @myage from user where ...;
    # select ... into @...  给变量赋值
    
    set @myage = (select age from user where ...);
    # set @... = (select ...) 给变量赋值
    

    如果select多个字段,给多个变量赋值,就必须用into

    select id, age into @myid, @myage from user where ...;
    
  • 循环控制
    • while
    while 条件 do            # 满足条件进入循环
        do something;
    end while;
    
    • loop
    my_loop: LOOP                      # 定义循环 (my_loop是自定义循环名称)
        do something;                  # 循环内执行操作
        if 条件 then                    # 跳出循环判断
            leave my_loop;             # 跳出循环
        end if;
    end LOOP;                          # 循环结束
    
    • repeat (注意:until跳出repeat 语句后面不能加分号)
    repeat
        do something;
        until 条件                  #满足条件结束repeat
    end repeat;
    
  • 条件判断
    if ... then
        do something;
    elseif
        do something;
    end if;
    
  • 游标操作

    游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力。可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理

    在存储过程中,是不能够将多结果集赋值给一个变量的,所以这个时候就需要用到游标了

    # 声明接收游标遍历结果的变量
    declare msg varchar(20);
    
    # 声明控制遍历游标的变量
    declare done int default false;
    
    # 声明游标,for后面的select语句查询结果为多结果
    declare cur cursor for select content from user_msg where ...;
    
    # 设定游标结束标志,含义是游标在结果集取不到数据时
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    
    # 打开游标
    open cur;
    
    # 游标遍历结果
    my_loop: loop
        fetch next from cur into msg;      # 从游标拿结果到msg变量
        if done then                       # 游标结果遍历完时,跳出循环
              leave my_loop;
        end if;
        do something;                      # 一些要执行的sql语句
    end loop;
    
    # 关闭游标
    close cur;
    
    # 可以声明多个游标,声明方式一样
    # 两个游标情况下,注意在遍历第二个之前把done标志设为false
    set done = false;
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • oracle存储过程常用技巧 我们在进行pl/sql编程时打交道最多的就是存储过程了。存储过程的结构是非常的简单的...
    dertch阅读 3,472评论 1 12
  • 数据库编程 嵌入式 SQL 嵌入式 SQL 的处理过程将 SQL 语句嵌入到程序设计语言中 , 如 C,C++,J...
    iOS_愛OS阅读 979评论 0 0
  • 转载自这里 存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Sto...
    杜七阅读 2,379评论 4 27
  • 1.PLSQL入门 Oracle数据库对SQL进行了扩展,然后加入了一些编程语言的特点,可以对SQL的执行过程进行...
    随手点灯阅读 595评论 0 8
  • 我们在进行pl/sql编程时打交道最多的就是存储过程了。存储过程的结构是非常的简单的,我们在这里除了学习存储过程的...
    AlbenXie阅读 2,956评论 1 3