zoukankan      html  css  js  c++  java
  • mysql--存储过程

    其类似于数据库中的函数,内部封装了SQL语句集合,会按照设计逻辑进行执行

    1.创建存储过程:注意在存储时:需要先改变定界符--delimiter //可以进行修改;为//

    delimiter //
    
    create procedure p1()
    
    begin
    
      语句集合
    
    end //
    
    delimiter ;
    
    执行方法
    
    call p1()

    2.参数解析

    其参数有三类in,out,inout

    in:是传入参数

    out:是传出参数,可以从中获取到结果集

    inout:既是当传入又是可以当做返回值

    含参实例

    //创建存储过程
    delimiter \
    create procedure p1(
            in i1 int,
            in i2 int,
            out i3,   
            inout i4 int   
    )
    begin
            declare d1 int;    ---声明变量
            declare d2 int defalut 0   ---设置默认值
            set d1 = 1;   ---赋值
            set i3  = d1 + d2
            set i4  = i4 +100
    end\
    delimiter;
    
    //执行存储过程
    set @t1 = 4;
    set @t2 = 0;
    call p1(1,2,@t1,@t2)
    select @t1,@t2;

    含逻辑语句

    delimiter //
    drop procedure if exists p1()//
    create procedure p1(
        in i1 int,
        out i2 int
    )
    begin
        declare tp int default 3;
        if i1 = 1 then
            set i2 = 100 + d2;
        elseif i1 = 2 then
            set i2 = 200 + d2;
        else then
            set i2 = 1000 + d2;
        end if;
    end //
    delimiter ;        

    直接获取结果集

    delimiter //
    create proceduer p1()
    begin
        select * from info;
    end
    delimiter ;
    
    call p1() ---即可获取结果集

    结果集与变量结合

    delimiter //
    drop procedure if exists p1(
        in i1 int,
        inout i2 int,
        out i3 int
    )
    begin
       declare d2 int default 3;
       select stu_id  into d2 from info where id = 5;
       select name from info where stu_id = d2;
    end //
    delimiter ;

    python操作存储过程

    import pymysql
    
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='t1')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    # 执行存储过程
    #第二个是传入参数,多余的会自己去掉,out也是会跳过,只有in,和inout会在参数中获取数据
    res = cursor.callproc('p1', args=(1, 22, 3, 4))
    #若是存储过程中含有select结果集,或将结果集传入res中
    
    
    # 获取执行完存储的参数
    #命名规则@_存储过程名_获取参数序
    #例如@_p1_0获取存储过程p1的第一个参数值
    cursor.execute("select @_p1_0,@_p1_1,@_p1_2,@_p1_3")
    result = cursor.fetchall()
    
    conn.commit()
    cursor.close()
    conn.close()

    删除存储过程:

    drop procedure proc_name

    调用存储过程:

    #无参
    call p1()
    
    #有参
    call p1(1,2)
    
    #含有int,out,inout
    set @p1=0;
    set @p2=3;
    call p1(1,2,@p1,@p2)
  • 相关阅读:
    zjoj1706: [usaco2007 Nov]relays 奶牛接力跑
    bzoj1784: [Usaco2010 Jan]island
    [PKUSC2018]真实排名
    [PKUSC2018]主斗地
    回来了
    P4887 第十四分块(前体)
    P3604 美好的每一天
    Codeforces Round #660(CF1388)
    BOI2020 DAY2
    BZOJ 5281--[Usaco2018 Open]Talent Show(分数规划&单调队列&DP)
  • 原文地址:https://www.cnblogs.com/ssyfj/p/8545601.html
Copyright © 2011-2022 走看看