• MySQL数据库----存储过程


    存储过程

    存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql

    -- 存储过程的优点:
    --   1.程序与数据实现解耦
    --   2.减少网络传输的数据量
    -- 但是看似很完美,还是不推荐你使用
    ===========创建无参的存储过程===============
    delimiter //
    create procedure p1()
    begin
        select * from test;
        insert into test(username,dep_id) VALUES('egon',1);
    end //
    delimiter ;
    
    #调用存储过程
    #在mysql中调用
    call p1();
    #在python程序中调用
    cursor.callproc('p1')
    创建无参的存储过程

    对于存储过程,可以接收参数,其参数有三类:

      #in 仅用于传入参数用

      #out 仅用于返回值用

       #inout 既可以传入又可以当作返回值

    ==========创建有参的存储过程(in)===============
    delimiter //
    create procedure p2(
        in m int, #从外部传进来的值
        in n int
    )
    begin
        insert into test(username,dep_id) VALUES ('haha',2),('xixi',3),('sasa',1),('yanyan',2);
        select * from test where id between m and n;
    end //
    delimiter ;
    
    #调用存储过程
    call p2(3,7); #在mysql中执行
    #在python程序中调用
    cursor.callproc('p2',arg(3,7))
    创建有参的存储过程(in)
    ===========创建有参的存储过程(out)===============
    delimiter //
    create procedure p3(
        in m int, #从外部传进来的值
        in n int,
        out res int
    )
    begin
        select * from test where id between m and n;
        set res = 1;#如果不设置,则res返回null
    end //
    delimiter ;
    
    #调用存储过程
    set @res = 11111;
    call p3(3,7,@res);
    select @res; #在mysql中执行
    
    #在python中
    res=cursor.callproc('p3',args=(3,7,123)) #@_p3_0=3,@_p3_1=7,@_p3_2=123
    print(cursor.fetchall()) #只是拿到存储过程中select的查询结果
    cursor.execute('select @_p3_0,@_p3_1,@_p3_2')
    print(cursor.fetchall()) #可以拿到的是返回值
    创建有参的存储过程(out)
    =============创建有参存储过程之inout的使用==========
    delimiter //
    create procedure p4(
        inout m int
    )
    begin
        select * from test where id > m;
        set m=1;
    end //
    delimiter ;
    
    #在mysql中
    set @x=2;
    call p4(@x);
    select @x;
    
    ===========================
    delimiter //
    create procedure p5(
        inout m int
    )
    begin
        select * from test11111 where id > m;
        set m=1;
    end //
    delimiter ;
    
    #在mysql中
    set @x=2;
    call p5(@x);
    select @x;  #这时由于不存在那个表就会报错,查看的结果就成2了。
    创建有参存储过程之inout的使用
    -- 无参数
    call proc_name()
    
    -- 有参数,全in
    call proc_name(1,2)
    
    -- 有参数,有in,out,inout
    set @t1=0;
    set @t2=3;
    call proc_name(1,2,@t1,@t2)
    
    执行存储过程
    
    在MySQL中执行存储过程

    补充:程序与数据库结合使用的三种方式

    #方式一:
        MySQL:存储过程
        程序:调用存储过程
    
    #方式二:
        MySQL:
        程序:纯SQL语句
    
    #方式三:
        MySQL:
        程序:类和对象,即ORM(本质还是纯SQL语句)
     
    import pymysql
    conn = pymysql.connect(host = 'localhost',user = 'root',password='123456',database = 'lianxi',charset = 'utf8')
    cursor = conn.cursor(pymysql.cursors.DictCursor)  #以字典的形式输出
    # rows = cursor.callproc('p1')  #1.调用存储过程的方法 ,没参数时
    # rows = cursor.callproc('p2',args=(3,7))  #有参数时
    rows = cursor.callproc('p3', args=(3,7,123))  #@_p3_0=3,@_p3_1=7 ,@_p3_2=123  #有参数时
    conn.commit()  #执行
    print(cursor.fetchall())
    cursor.execute('select @_p3_0,@_p3_1,@_p3_2')
    print(cursor.fetchall())
    cursor.close()
    conn.close()

    删除存储过程

    drop procedure proc_name;

  • 相关阅读:
    Flagger on ASM——基于Mixerless Telemetry实现渐进式灰度发布系列 2 应用级扩缩容
    Flagger on ASM·基于Mixerless Telemetry实现渐进式灰度发布系列 1 遥测数据
    HTML特殊符号整理
    jq代替jsdom操作部分
    js操作html的基本方法
    使用for循环疑难问题
    使用盒子定位布局时margin和padding使用
    四使用浮动div布局
    解决Junit单元测试 找不到类 ----指定Java Build Path
    微信服务号申请、认证、认证后申请商家支付接口
  • 原文地址:https://www.cnblogs.com/TheLand/p/8486776.html
Copyright © 2020-2023  润新知