美文网首页
触发器,存储过程 和 视图初识

触发器,存储过程 和 视图初识

作者: 我Bug写的太好了 | 来源:发表于2019-04-24 13:38 被阅读0次

    触发器

    触发器作用:当操作了某张表时,希望同时触发一些动作/行为,可以使用触发器完成
    需求: 当向员工表插入一条记录时,希望mysql自动同时往日志表插入数据

        -- 创建触发器(添加)
        CREATE TRIGGER tri_empAdd AFTER INSERT ON employee FOR EACH ROW   
             INSERT INTO test_log(content) VALUES('员工表插入了一条记录');
    
        -- 创建触发器(修改)
        CREATE TRIGGER tri_empUpd AFTER UPDATE ON employee FOR EACH ROW    
             INSERT INTO test_log(content) VALUES('员工表修改了一条记录');
         
        -- 创建触发器(删除)
        CREATE TRIGGER tri_empDel AFTER DELETE ON employee FOR EACH ROW  
             INSERT INTO test_log(content) VALUES('员工表删除了一条记录');
    
    
        tri_empAdd:标识触发器名称,用户自行指定;
        AFTER:标识触发时机,取值为 BEFORE 或 AFTER;( 之前 或 之后 )
        NSERT:标识触发事件,取值为 INSERT、UPDATE 或 DELETE;
        employee :标识建立触发器的表名,即在哪张表上建立触发器;
        trigger_stmt:触发器程序体,可以是一句SQL语句,或者用 BEGIN 和 END 包含的多条
    

    存储过程

    • 基本格式

        -- 声明结束符
        -- 创建存储过程
        DELIMITER $  -- 声明存储过程的结束符
        CREATE PROCEDURE pro_test()    --存储过程名称(参数列表)
        BEGIN
            -- 可以写多个sql语句;      -- sql语句+流程控制
            SELECT * FROM employee;
        END $  -- 结束 结束符
      
        -- 执行存储过程
        CALL pro_test();   -- CALL 存储过程名称(参数);
      
        -- 删除存储过程
        DROP PROCEDURE pro_test;
      
        参数:
        IN:   表示输入参数,可以携带数据带存储过程中
        OUT: 表示输出参数,可以从存储过程中返回结果
      
    • 带有输入参数的存储过程

        需求:传入一个员工的id,查询员工信息
      
        DELIMITER $
        CREATE PROCEDURE pro_findById(IN eid INT)  -- IN: 输入参数
        BEGIN
            SELECT * FROM employee WHERE id=eid;
        END $ 
      
        -- 调用
        CALL pro_findById(4);
      
    • 带有输出参数的存储过程

        DELIMITER $
        CREATE PROCEDURE pro_testOut(OUT str VARCHAR(20))  -- OUT:输出参数
        BEGIN
                -- 给参数赋值
            SET str='hellojava';
        END $
      
    • 带有输入输出参数的存储过程

        DELIMITER $
        CREATE PROCEDURE pro_testInOut(INOUT n INT)  -- INOUT: 输入输出参数
        BEGIN
           -- 查看变量
           SELECT n;
           SET n =500;
        END $
      
        -- 调用
        SET @n=10;
      
        CALL pro_testInOut(@n);
      
        SELECT @n;
      
    • 带有条件判断的存储过程

        需求:输入一个整数,如果1,则返回“星期一”,如果2,返回“星期二”,如果3,返回“星期三”。其他数字,返回“错误输入”;
        
        DELIMITER $
        CREATE PROCEDURE pro_testIf(IN num INT,OUT str VARCHAR(20))
        BEGIN
            IF num=1 THEN
                SET str='星期一';
            ELSEIF num=2 THEN
                SET str='星期二';
            ELSEIF num=3 THEN
                SET str='星期三';
            ELSE
                SET str='输入错误';
            END IF;
        END $
      
        --调用
        CALL pro_testIf(4,@str);
         
        SELECT @str;
      
    • 带有循环功能的存储过程

        需求: 输入一个整数,求和。例如,输入100,统计1-100的和
      
        DELIMITER $
        CREATE PROCEDURE pro_testWhile(IN num INT,OUT result INT)
        BEGIN
            -- 定义一个局部变量
            DECLARE i INT DEFAULT 1;
            DECLARE vsum INT DEFAULT 0;
            WHILE i<=num DO
                  SET vsum = vsum+i;
                  SET i=i+1;
            END WHILE;
            SET result=vsum;
        END $
      
        --调用
        CALL pro_testWhile(100,@result);
      
        SELECT @result;

    相关文章

      网友评论

          本文标题:触发器,存储过程 和 视图初识

          本文链接:https://www.haomeiwen.com/subject/raxggqtx.html