• Python9-MySQL-MySQL存储过程-视图-触发器-函数-day45


    视图:某个查询语句设置别名,日后方便使用
    CREATE VIEW v1 as SELECT * FROM student WHERE sid >10
    -创建:
    create view 视图名称 as SQL
    视图是虚拟的
    -修改
    alter view 视图名称 as SQL
    -删除
    drop view 视图名称
    触发器:当对某张表做:增删改操作的时候,可以使用触发器自定义关联行为
    # 插入前
    CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW
    BEGIN
        ...
    END
    
    # 插入后
    CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW
    BEGIN
        ...
    END
    
    # 删除前
    CREATE TRIGGER tri_before_delete_tb1 BEFORE DELETE ON tb1 FOR EACH ROW
    BEGIN
        ...
    END
    
    # 删除后
    CREATE TRIGGER tri_after_delete_tb1 AFTER DELETE ON tb1 FOR EACH ROW
    BEGIN
        ...
    END
    
    # 更新前
    CREATE TRIGGER tri_before_update_tb1 BEFORE UPDATE ON tb1 FOR EACH ROW
    BEGIN
        ...
    END
    
    # 更新后
    CREATE TRIGGER tri_after_update_tb1 AFTER UPDATE ON tb1 FOR EACH ROW
    BEGIN
        ...
    END
    
    
    
    delimiter //
    create TRIGGER t1 BEFORE INSERT on student for each ROW
    BEGIN
        INSERT into teacher(tname) VALUES('tim');
    END //
    delimiter ;
    --
    
    INSERT INTO student(gender,class_id,sname) VALUES('',2,'多长');
    
    # NEW  代指新数据,在两张表中插入同样的数据
    # OLD  代指老数据 在两张表中删除和更新同样的数据
    -- delimiter //
    -- create TRIGGER t1 BEFORE INSERT on student for each ROW
    -- BEGIN
    --     INSERT into teacher(tname) VALUES(NEW.sname);
    -- END //
    -- delimiter ;
    内置函数:
        执行函数
            -- SELECT CURDATE()   #日期
            -- SELECT CHAR_LENGTH('st')  #字符串长度
            -- SELECT CONCAT('tim','ttutu','ssl')  #拼接
            时间格式化:
                SELECT DATE_FORMAT(date,format)
                SELECT DATE_FORMAT('2009-10-04', '%W %M %Y');
    自定义函数:
            delimiter \
            create function f1(
                i1 int,
                i2 int)
            returns int
            BEGIN
                declare num int;
                set num = i1 + i2;
                return(num);
            END \
            delimiter ;
    # 存储过程是一个SQL语句集合,当主动去调用存储过程时,其中内部的SQL语句会按照逻辑执行。
    # 保存在MySQL上的一个别名---》一坨SQL语句

    方式一:
    Mysql:存储过程
    程序:调用存储过程
    方式二:
    mysql:
    程序:sql语句
    方式三:
    mysql
    程序:类和对象(sql语句)


    delimiter //
    CREATE PROCEDURE p1()
    BEGIN
       SELECT * FROM student;
       INSERT into teacher(tname) VALUES("ct");
    END //
    delimiter ;
    call p1()
    import pymysql
    conn = pymysql.connect(host='127.0.0.1',user='root',password='123',database='homework666',charset='utf8')
    cursor = conn.cursor()
    cursor.callproc('p1',(12,2))
    conn.commit()
    result =  cursor.fetchall()
    print(result)
    cursor.close()
    conn.close()
     1. 简单
    create procedure p1()
    BEGIN
    select * from student;
    INSERT into teacher(tname) values("ct");
    END

    call p1()
    cursor.callproc('p1')
    2. 传参数(in,out,inout)
    delimiter //
    create procedure p2(
    in n1 int,
    in n2 int
    )
    BEGIN

    select * from student where sid > n1;
    END //
    delimiter ;

    call p2(12,2)
    cursor.callproc('p2',(12,2))
    3.参数out
    delimiter //
    create procedure p3(
    in n1 int,
    out n2 int
    )
    BEGIN

    set n2 = 123123;
    select * from student where sid > n1;
    END //
    delimiter ;
    set @v1=123;
    call p3(12,@v1);
    SELECT @v1;

    import pymysql
    conn = pymysql.connect(host='127.0.0.1',user='root',password='123',database='homework666',charset='utf8')
    cursor = conn.cursor()
    cursor.callproc('p3',(12,2))
    r1 =  cursor.fetchall()
    print(r1)
    cursor.execute('select @_p3_0,@_p3_1')
    r2 =  cursor.fetchall()
    print(r2)
    cursor.close()
    conn.close()
    # 事务:
    '''
    delimiter \
    create PROCEDURE p5(
            OUT p_return_code tinyint
    )
    BEGIN
        DECLARE exit handler for sqlexception
        BEGIN
          -- ERROR
          set p_return_code = 1;
          rollback;
        END;
    
      START TRANSACTION;
        DELETE from tb1;
        insert into tb2(name)values('seven');
      COMMIT;
    
      -- SUCCESS
      set p_return_code =2;
    
    END\
    delimiter ;
    '''
    # 游标
    # 1、声明游标
    # 2、获取A表中数据
    #   my_cursor  select id,num form A
    # 3、for  row_id,row_num in my_cursor:
    #     检测循环是否还有数据,如果无数据
    #     break
    #     insert into B(num) values(row_id+row_num)
    '''
    delimiter //
    create procedure p6()
    begin
        declare row_id int; -- 自定义变量1
        declare row_num int; -- 自定义变量2
        DECLARE done INT DEFAULT FALSE;
        declare temp int;
    
        DECLARE my_cursor CURSOR FOR select id,num from A;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    
        open my_cursor;
            xxoo: LOOP
                fetch my_cursor into row_id,row_num;
                if done then
                    leave xxoo;
                END IF;
                set temp = row_id+row_num;
                insert into B(number) values(temp);
            end loop xxoo;
        close my_cursor;
    end  //
    delimter;
    
    执行:
    call p6()
    '''
    # 动态执行SQL(防SQL注入)
    '''伪代码
    delimiter //
    create procedure p7(
        in tp1 varchar(225),
        in arg int
    )
    begin
        1.预检测某个东西 sql语句的合法性
        2.格式化tpl + arg
        3.执行SQL语句
        set @xo =arg
        PREPARE xxx FROM 'select * from student where sid > ?';
        EXECUTE xxx USING @xo;
        DEALLOCATE prepare prod;
    end  //
    delimter;
    call p7("select * from tb where id >?",9)
    '''
    '''真实代码
    delimiter \
    CREATE PROCEDURE p8 (
        in nid int
    )
    BEGIN
        set @nid = nid;
        PREPARE prod FROM 'select * from student where sid > ?';
        EXECUTE prod USING @nid;
        DEALLOCATE prepare prod;
    END\
    delimiter ;
    
    '''





  • 相关阅读:
    JPA注解
    STM32—cubeMX+DMA+USART 接收任意长度的数据
    GDI+绘制有填充和无填充颜色的长方形和圆形(C#)
    C#基本线程同步
    三层架构的上位机软件开发
    C# DataTable
    外网穿透后的域名解析(C#winform)
    基于WIFI模块(ESP8266)与非同一个局域网内服务器建立连接(转)
    2019年9月6日 Cadence 16.6PCB封装设计记录(二)
    Cadence 16.6PCB封装设计记录(一)
  • 原文地址:https://www.cnblogs.com/zhangtengccie/p/10464202.html
Copyright © 2020-2023  润新知