zoukankan      html  css  js  c++  java
  • MySQL自定义函数、触发器、存储过程

    存储过程

    概念

    存储过程,是一个数据库对象,类似一个函数。

    在存储过程中可以使用SQL中的绝大部分内容,并且可以加入编程语言的特性(循环判断分支)。

    编写好存储过程之后,可以在客户端调用存储过程,存储过程会自动的执行里面的一系列代码
    在存储过程中使用DDL/DML/TCL 和普通SQL一样,DQL和普通SQL略有区别。

    创建存储过程

    创建存储过程的语法

    create PROCEDURE 过程名称([参数列表])
    BEGIN
         SQL语句
    END;
    --参数列表的声明规范:参数的输入、输出类型 参数名称 参数的类型;过个参数之间用逗号分隔
    
    --参数的输入/输出类型
    1. In类型   外界数据传递给存储过程
    2. Out类型  可以把存储过程中的数据返回给外界调用者
    3. INOUT类型  既可以传入 又可以传出
    
    

    创建存储过程

    -- 创建一个存储过程,查询EMP表中的数据总数并返回结果
    -- 注意:声明过程中需指明参数类型,但是没有参数长度的指定 
    create PROCEDURE FUNC1(OUT Total INT)
    BEGIN
         -- 把查询结果赋值给OUT类型的参数  select .. into .. from ..
         -- 通过OUT类型参数将结果返回给调用者
         select count(1) into Total from emp;
    END;
    

    查看创建的存储过程

    CREATE DEFINER=`root`@`localhost` PROCEDURE `FUNC1`(OUT Total INT)
    BEGIN
         -- 把查询结果赋值给OUT类型的参数
         -- 通过OUT类型参数将结果返回给调用者
         select count(1) into Total from emp;
    END;
    

    调用存储过程

    -- 调用义好的存储过程,就像调用函数一样
    call FUNC1(@Total); -- 调用存储过程,通过@Total给存储过程传递一个OUT类型参数
    select @Total; -- 存储过程通过OUT类型参数返回结果,查询OUT类型参数获取存储过程的执行结果
    

    删除存储过程

    drop procedure FUNC1;
    

    练习

    -- 创建存储过程 返回两个数相加的结果
    -- 如果没有指明参数的输入输出类型,默认为IN类型
    create procedure func2(num1 INT,num2 int,OUT res int)
    begin
      -- 把num1+num2的结果赋值给res
      set res = num1+num2;
    end;
    
    -- 调用存储过程,查询结果,参数名字并不一定与定义的参数名一样
    call func2(10,20,@re);
    select @re;  --30
    

    存储过程缺点

    不能移植 无法移植 在不同数据库中,存储过程语法不同

    不能移植 一旦使用存储过程 将无法移植

    不能移植 除非不考虑移植 才使用存储过程

    面试问到就说没用过,因为项目考虑数据移植性

    自定义函数

    -- 定义一个函数
    create function f007(arg1 int, arg2 int)
    returns int
    Begin
         declare result int default 0;
         set result = arg1 + arg2;
         return(result);
    end ;
    -------------------------------调用函数--------------
    select f007(1,5);
    

    函数与存储过程的区别

    函数必须有返回值

    函数中不能使用SQL

    触发器

    当对某张表做DML操作时,可以使用触发器自定义关联行为。

    触发器用于在数据库的DML操作之前/之后执行某些操作

    触发器trigger的定义语法

    -- 在tab1表中创建一个触发器trig1 在每一行数据插入之前/之后 do something
    create TRIGGER trig1 before/after insert on tab1 for each row
    begin
         --do something
    end;
    

    NEW关键字 代表新数据 NEW.name获取新数据的name值

    OLD关键字 代表老数据

    -- 在emp_bak中创建触发器t1,每次往emp_bak插入数据之前
    create trigger t1 before insert on emp_bak for each row
    begin
    	-- 执行往emp_bak1表插入相同的数据   NEW代表新数据
         insert into emp_bak1(empno,ename)values(NEW.empno,NEW.ename);
    end;
    -- 测试
    insert into emp_bak(empno,ename)values(2234,"张三");
    
    --  在emp_bak中创建触发器t2,每次update emp_bak数据之后
    create trigger t2 after update on emp_bak for each row
    begin
    	-- 在emp_bak1表中执行相同的操作  OLD代表老数据
         update emp_bak1 set ename = NEW.ename where  ename=OLD.name;
    end;
    -- 测试
    update emp_bak set ename="张三丰" where ename="张三";
    

    不推荐使用视图和触发器

    视图 在开发环境怎么折腾都没问题 但是用于生产环境时视图想变动就难了

    delimiter

    终止符定义,默认是;

    delimiter \将终止符定义为\

  • 相关阅读:
    vue实现图片预览旋转/放大缩小/上下切换等功能
    VMware安装遇到的问题
    webstrom弹出Server's certificate is not trusted 解决方法
    this.setData is not a function;at pages/index/index onLoad function;at api request success callback function TypeError: this.setData is not a function
    小程序结构目录
    第一个微信小程序
    用C#开发ActiveX控件给VB使用
    处理WIN7,winxp下安装vb6,出现config.nt 无法运行16位DOS程序故障的方法
    VISUALSVN: UNABLE TO CONNECT TO A REPOSITORY AT URL 无法连接主机的解决办法
    程序全屏开机运行,不允许操作电脑桌面,适用工控机触摸屏
  • 原文地址:https://www.cnblogs.com/endurance9/p/10321310.html
Copyright © 2011-2022 走看看