zoukankan      html  css  js  c++  java
  • python学习笔记 day45 存储过程

    1. 存储过程

    存储过程也是一个别名,是保存在mysql中的一大堆sql语句所起的别名,日后可以直接不用在终端或者python中写sql语句 而是直接使用别名就可以拿到sql语句的执行结果;

    对比视图来看,视图是用来保存查询结果的一张临时表,是虚拟的表,不可以插入,只可以查询操作;

    而在存储过程中只需要写一个别名就可以自动去执行存储过程中的sql语句;

    所以试图就是别名代指的临时表,而存储过程就是用别名代指很多sql语句的操作;

    python中操作mysql数据库的三种方式:

    1. mysql中什么也不做,程序中写sql语句;

    2. mysql中什么也不做,程序来写类和对象(当然内部也会转化sql语句去执行);

    3. mysql 中写存储过程,程序直接调用存储过程的名称来执行存储过程中的sql语句;

    2. 简单存储过程

    在mysql终端:

    delimiter \ 
    create procedure p1()
    begin 
    select * from student;  -- 存储过程中可以写很多sql语句;
    insert into teacher(name) values("李丹");
    end\
    delimiter ;
    
    call p1(); -- 在mysql的终端直接使用call p1() 调用存储过程,会自动执行存储过程中的sql语句;

    运行结果:


               

    在pymysql中执行存储过程:

    import pymysql
    conn=pymysql.connect(host="localhost",user="root",password="******",database="db666",charset="utf8")  #charset="utf8" 是为了存储过程返回的结果集有中文时 不乱码
    cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)  # 参数是为了当查询结果按照字典形式显示;
    cursor.callproc("p1")  # 调用存储过程,执行存储过程中的sql语句(以前都是cursor.execute(sql,[arg1,arg2]))
    conn.commit()  # 存储过程的sql语句有增删改操作时需要把修改操作提交
    result=cursor.fetchall()  # 存储过程的sql语句有select查询语句 需要拿到查询结果集使用cursor.fetchall()获取;
    print(result)
    
    cursor.close()
    conn.close()

    运行结果:

     3. 存储过程带参数--in(参数三种方式 in out inout)

    delimiter \
    create procedure p2(
      in n1 int,
      in n2 int)
    begin 
     select * from student where id>n1;
     insert into teacher(name) values("尺子");
    end\
    delimiter ;
    
    call p2(4,2) -- 直接传参数,这里第二个参数n2没有用到,但是也是需要传;

    运行结果:

    import pymysql
    conn=pymysql.connect(host="localhost",user="root",password="******",database="db666",charset="utf8")
    cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
    cursor.callproc("p2",(4,2))   # 调用存储过程,p2有参数 在cursor.callproc("p2",[arg1,arg2])传入参数;
    conn.commit()  # 存储过程中有增删改操作时,需要进行提交
    result=cursor.fetchall() # 存储过程中有查询操作 可以使用cursor.fetchall()获取结果集
    print(result)
    
    cursor.close()
    conn.close()

    运行结果:


     4. 存储过程带参数---out

    delimiter \
    create procedure p3(
      in n1 int,
      out n2 int)  -- 存储过程中的out类型的参数,在后续调用存储过程传参数时需要传一个变量
    
    begin 
      set n2=666;
      select * from teacher where id>n1;
    end\
    delimiter ;
    
    set @v1=0;  -- 设置存储过程中out类型的变量n1 初始值为0;
    call p3(4,@v1); 
    select @v1;   -- 查看out类型的变量 在经过存储过程set n2=666之后修改过的值
    
    drop procedure p3; -- 删除存储过程p3;

    运行结果:

               

    import pymysql
    conn=pymysql.connect(host="localhost",user="root",password="123",database="db666",charset="utf8")
    cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
    cursor.callproc("p3",(4,12))  # 调用存储过程,传参数 但是由于存储过程的参数n1是out类型,所以后续可以使用cursor.execute("select @_p3_0,@_p3_1")来获取参数的返回结果
    conn.commit()  # 当存储过程中的sql语句含有增删改操作时,需要提交
    result=cursor.fetchall()  # 存储过程的sql语句含有select查操作时 需要获取查询结果集,可以使用cursor.fetchall()
    print(result)
    
    cursor.execute("select @_p3_0,@_p3_1")
    result=cursor.fetchall()   # 上面的cursor.execute("select @_p3_1") 可以获得存储过程中参数的值
    print(result)
    
    cursor.close()
    conn.close()

     运行结果:

     自定义函数有return 但是不可以select ,存储过程可以select  但是不可以return  但是自定义函数和存储过程都可以传参~

     其实out 可以用于表示存储过程的执行结果(比如存储过程中的sql语句没有select需要返回结果集的 而是一些insert update delete 操作 那在终端调用存储过程是没有任何反应的,所以可以传一个out类型的参数标志存储过程的执行过程~)

    talk is cheap,show me the code
  • 相关阅读:
    预排序遍历树算法牺牲写性能的改进
    改造PAXOS算法消灭活锁
    扣减库存策略采用订单是否锁定库存方案
    [转]java-小技巧-001-Long序列化到前端不支持
    springboot-mybatis 批量insert
    VS2010 调试启动特别慢
    C# Winform App 获取当前路径
    DevExpress PivotGridControl控件
    (JavaScript)《JS面向对象编程指南》-- JavaScript基本数据类型、数组、循环
    (HTML5)HTML5 Web Notification桌面通知实践
  • 原文地址:https://www.cnblogs.com/xuanxuanlove/p/9988328.html
Copyright © 2011-2022 走看看