首页 > 数据库 >Java学习 - MySQL存储过程、函数和触发器练习实例

Java学习 - MySQL存储过程、函数和触发器练习实例

时间:2024-06-23 10:30:01浏览次数:38  
标签:触发器 END INT CREATE times DELIMITER MySQL Java SELECT

存储过程

  • 存储过程是什么

    存储过程是一组已经编译好的SQL语句
    
  • 存储过程优点有什么

    安全
    性能高
    提高代码复用性
    
  • 创建存储过程的语法

    DELIMITER $ # 不能加分号
    
    CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名 参数类型)
    BEGIN
        存储过程语句块
    END;
    
    $
    
    DELIMITER ;
    
  • 创建一个无参的存储过程:打印 myemployees 库中 employees 表中 employee_id = 168的first_name,并调用

    DELIMITER $
    
    CREATE PROCEDURE myprocedure1()
    BEGIN
         SELECT first_name
         FROM employees
         WHERE employee_id = 168;
    END;
    
    $
    
    DELIMITER ;
    
    CALL myprocedure1();
    
  • 创建一个IN参数存储过程:打印传递进来的参数

    DELIMITER $
    
    CREATE PROCEDURE myprocedure2(IN v INT)
    BEGIN
        SELECT v;
    END;
    
    $
    
    DELIMITER ;
    
    SET @v = 10;
    
    CALL myprocedure2(@v);
    
  • 创建一个IN参数和OUT参数存储过程:传递来一个变量 invalue = 10,输出一个变量 outvalue = invalue * 2

    DELIMITER $
    
    CREATE PROCEDURE myprocedure3(IN invalue INT,OUT outvalue INT)
    BEGIN
        SELECT invalue * 2 INTO outvalue;
    END;
    
    $
    
    DELIMITER ;
    
    SET @invalue = 10;
    SET @outvalue = 0;
    
    CALL myprocedure3(@invalue,@outvalue);
    
    SELECT @outvalue;
    
  • 创建一个INOUT参数存储过程:传递进来一个数,令其变为10倍

    DELIMITER $
    
    CREATE PROCEDURE myprocedure4(INOUT inoutvalue INT)
    BEGIN
        SET inoutvalue = inoutvalue * 10;
    END;
    
    $
    
    DELIMITER ;
    
    SET @value = 10;
    
    CALL myprocedure4(@value);
    
    SELECT @value;
    
  • 创建一个IN参数存储过程:输入一个数,如果大于0显示’greater than 0’,小于零显示’less than 0’,等于0显示’equals 0’

    DELIMITER $
    
    CREATE PROCEDURE myprocedure5(IN target INT)
    BEGIN
        SELECT
            CASE
                WHEN target > 0 THEN 'greater than 0'
                WHEN target = 0 THEN 'equalse 0'
                ELSE 'less than 0'
            END
        AS result;
    END;
    
    $
    
    DELIMITER ;
    
    CALL myprocedure5(-1);
    CALL myprocedure5(0);
    CALL myprocedure5(1);
    
  • 创建一个IN参数和OUT参数存储过程:输入一个数,如果等于1显示’Hello’,等于2显示’World’,否则显示’Byebye’,结果同时保存到OUT参数中

    DELIMITER $
    
    CREATE PROCEDURE myprocedure6(IN target INT,OUT result VARCHAR(20))
    BEGIN
        SELECT
            CASE target
                WHEN target = 1 THEN 'Hello'
                WHEN target = 2 THEN 'World'
                ELSE 'ByeBye'
            END
        INTO result;
    END;
    
    $
    
    DELIMITER ;
    
    CALL myprocedure6(0,@ret1);
    CALL myprocedure6(1,@ret2);
    CALL myprocedure6(2,@ret3);
    
    SELECT @ret1,@ret2,@ret3;
    
  • 创建一个无参的存储过程:循环打印 myemployees 库中 employees 表中 employee_id = 168的first_name3次

    DELIMITER $
    
    CREATE PROCEDURE myprocedure5()
    BEGIN
        DECLARE times INT DEFAULT 0;
        WHILE times < 3 DO
            SELECT first_name
            FROM employees
            WHERE employee_id = 168;
            
            SET times = times + 1;
       END WHILE;
    END;
    
    $
    
    DELIMITER ;
    
    CALL myprocedure5();
    
  • 创建一个IN参数存储过程:输入一个正整数,打印它这么多次"This is REPEAT UNITL"

    DELIMITER $
    
    CREATE PROCEDURE myprocedure6(IN times INT)
    BEGIN
        REPEAT 
            SELECT 'This is REPEAT UNTIL';
            SET times = times - 1;
        UNTIL times < 0 END REPEAT;
    END;
    
    $
    
    DELIMITER ;
    
    CALL procedure6(10);
    
  • 创建一个OUT参数存储过程:返回1x2x3x…x10的结果给一个OUT参数result,使用LOOP循环

    DELIMITER $
    
    CREATE PROCEDURE myprocedure7(OUT result INT)
    BEGIN
        DECLARE times INT DEFAULT 1;
        SET result = 1;
        tt:LOOP
            SET times = times + 1;
            SET result = result * times;
            
            IF times > 10
                THEN LEAVE tt;
            END IF;
        END LOOP;
    END;
    
    $
    
    DELIMITER ;
    
    SET @result = 0;
    
    CALL myprocedure7(@result);
    
    SELECT @result;
    
  • 查看有哪些存储过程

    SHOW PROCEDURE STATUS;
    
  • 查看存储过程myprocedure1的创建语句

    SHOW CREATE PROCEDURE myprocedure1;
    
  • 删除当前数据库中本次练习创建的存储过程

    DROP PROCEDURE myprocedure1;
    DROP PROCEDURE myprocedure2;
    DROP PROCEDURE myprocedure3;
    DROP PROCEDURE myprocedure4;
    DROP PROCEDURE myprocedure5;
    DROP PROCEDURE myprocedure6;
    DROP PROCEDURE myprocedure7;
    DROP PROCEDURE myprocedure8;
    DROP PROCEDURE myprocedure9;
    DROP PROCEDURE myprocedure10;
    

函数

  • 函数是什么,与存储过程的区别

    类似存储过程,是一组编译好的SQL语句
    
  • 函数与存储过程的区别

    函数必须有返回值和return语句,参数形式为  参数名  参数类型,取消了参数模式
    函数如果使用 SELECT,则必须配合INTO关键字,因为函数不允许出现结果集
    
  • 函数优点是什么

    增强代码复用性
    将执行过程封装起来,增强安全性
    因为是已经编译好的SQL语句,性能较高
    
  • 创建函数的语法

    DELIMITER $
    
    CREATE FUNCTION 函数名(参数名 参数类型) RETURNS 返回值类型
    BEGIN
        函数体
    END;
    
    $
    
    DELIMITER ;
    
  • 函数能不要返回值,不要return语句吗

    不行,必须要有返回值和return语句
    
  • 创建一个无参的函数:用于查找 myemployees 库中 employees 表中 employee_id = 168的first_name

    DELIMITER $
    
    CREATE FUNCTION myfunction1() RETURNS VARCHAR(30)
    BEGIN
        DECLARE ret varchar(30);
        
        SELECT first_name INTO ret
        FROM employees
        WHERE employee_id = 168;
        
        RETURN ret;
    END;
    
    $
    
    DELIMITER ;
    
    SELECT myfunction1();
    
  • 创建一个含参函数:接收传递进来的参数,返回这个参数与"-myfunction2"的拼接结果

    DELIMITER $
    
    CREATE FUNCTION myfunction2(invar VARCHAR(30)) RETURNS VARCHAR(30)
    BEGIN
        RETURN CONCAT(invar,'-myfunction2');
    END;
    
    $
    
    DELIMITER ;
    
    SELECT myfunction2('abc');
    
  • 创建一个含参函数:传递来一个变量 invalue = 10,返回 invalue * 2

    DELIMITER $
    
    CREATE FUNCTION myfunction3(invalue INT) RETURNS INT
    BEGIN
        RETURN invalue * 2;
    END;
    
    $
    
    DELIMITER ;
    
    SET @invalue = 10;
    
    SELECT myfunction3(@invalue);
    
  • 创建一个含参函数:输入一个数,如果大于0返回’greater than 0’,小于零返回’less than 0’,等于0返回’equals 0’

    DELIMITER $
    
    CREATE FUNCTION myfunction4(invalue INT) RETURNS VARCHAR(30)
    BEGIN
        RETURN 
            CASE
                WHEN invalue > 0 THEN 'greater than 0'
                WHEN invalue = 0 THEN 'equals 0'
                WHEN invalue < 0 THEN 'less than 0'
            END
        ;
    END;
    
    $
    
    DELIMITER ;
    
    SELECT myfunction4(-1);
    SELECT myfunction4(0);
    SELECT myfunction4(1);
    
  • 创建一个含参函数:输入一个数,如果等于1返回’Hello’,等于2返回’World’,否则返回’Byebye’

    DELIMITER $
    
    CREATE FUNCTION myfunction5(invalue INT) RETURNS VARCHAR(30)
    BEGIN
        RETURN 
        	CASE invalue
        		WHEN invalue = 1 THEN 'Hello'
        		WHEN invalue = 2 THEN 'World'
        		ELSE 'ByeBye'
            END
        ;
    END;
    
    $
    
    DELIMITER ;
    
    SELECT myfunction5(1);
    SELECT myfunction5(2);
    SELECT myfunction5(3);
    
  • 创建一个无参函数:返回1+2+…+100的结果【使用while循环】

    DELIMITER $
    
    CREATE FUNCTION myfunction6() RETURNS INT
    BEGIN
        DECLARE times INT DEFAULT 0;
        DECLARE retsum INT DEFAULT 0;
        
        WHILE times < 101 DO
            SET retsum = retsum + times;
            SET times = times + 1;
        END WHILE;
        
        RETURN retsum;
    END;
    
    $
    
    DELIMITER ;
    
    SELECT myfunction6();
    
  • 创建无参函数:返回1x2x3x…x10的结果【使用LOOP循环】

    DELIMITER $
    
    CREATE FUNCTION myfunction7() RETURNS INT
    BEGIN
        DECLARE times INT DEFAULT 1;
        DECLARE retsum INT DEFAULT 1;
        
        tt:LOOP
            SET retsum = retsum * times;
            SET times = times + 1;
            
            IF times > 10
                THEN LEAVE;
            END IF;
        END LOOP;
        
        RETURN retsum;
    END;
    
    $
    
    DELIMITER ;
    
  • 查看所有的函数

    SHOW FUNCTION STATUS;
    
  • 查看函数myfunction1的创建语句

    SHOW CREATE FUNCTION myfunction1;
    
  • 删除本次练习所创建的所有函数

    DROP FUNCTION myfunction1;
    DROP FUNCTION myfunction2;
    DROP FUNCTION myfunction3;
    DROP FUNCTION myfunction4;
    DROP FUNCTION myfunction5;
    DROP FUNCTION myfunction6;
    DROP FUNCTION myfunction7;
    

触发器

  • 什么是触发器

    一类特殊的事务,可以监视某种DML操作,并触发相关DML操作
    
  • 创建触发器的语法

    DELIMITER $
    
    CREATE TRIGGER 触发器名字
    BEFORE|AFTER INSERT|UPDATE|DELETE ON 表名
    FOR EACH ROW
    BEGIN
        触发器的DML语句
    END
    
    $
    
    DELIMITER ;
    
  • 创建两张表

    goods:

    商品主键商品名库存
    1电脑28
    2自行车12

    orders:

    订单主键购买数量商品外键
    132
    251
    CREATE TABLE IF NOT EXISTS goods (
        g_id INT,
        g_name VARCHAR(20),
        g_count INT,
        
        CONSTRAINT pk PRIMARY KEY(g_id),
        CONSTRAINT uk UNIQUE(g_name)
    );
    
    INSERT INTO goods(g_id,g_name,g_count) 
    VALUES (1,'电脑',28),(2,'自行车',12);
    
    CREATE TABLE IF NOT EXISTS orders  (
        o_id INT PRIMARY KEY,
        o_count INT,
        o_g INT,
        
        CONSTRAINT fk_goods_g_id FOREIGN KEY(o_g) REFERENCES goods(g_id)
    );
    
    INSERT INTO orders(o_id,o_count,o_g) 
    VALUES (1,3,2),(2,5,1);
    
  • 创建触发器,让orders购买数量增多时,goods数量相应减少

    DELIMITER $
    
    CREATE TRIGGER my_trigger
    AFTER UPDATE ON orders
    FOR EACH ROW
    BEGIN
        UPDATE goods
        SET g_count = g_count - (new.o_count - old.o_count)
        WHERE g_id = new.o_g;
    END;
    
    $
    
    DELIMITER ;
    
  • 查看所有的触发器

    SHOW TRIGGERS;
    
  • 查看my_trigger的创建语句

    SHOW CREATE TRIGGERS my_trigger;
    
  • 删除my_trigger

    DROP TRIGGER my_trigger;
    

标签:触发器,END,INT,CREATE,times,DELIMITER,MySQL,Java,SELECT
From: https://blog.csdn.net/paofuluolijiang/article/details/139773583

相关文章

  • 纯CSS制作3D动态相册【流星雨3D旋转相册】HTML+CSS+JavaScriptHTML5七夕情人节表白网
    这是程序员表白系列中的100款网站表白之一,旨在让任何人都能使用并创建自己的表白网站给心爱的人看。此波共有100个表白网站,可以任意修改和使用,很多人会希望向心爱的男孩女孩告白,生性腼腆的人即使那个TA站在眼前都不敢向前表白。说不出口的话就用短视频告诉TA吧~制作一个表......
  • 第一百二十节 Java面向对象设计 - Java接口方法
    Java面向对象设计-Java接口方法方法声明您可以在接口中声明三种类型的方法:抽象方法静态方法默认方法在Java8之前,您只能在接口中声明抽象方法。修饰符static和default用于分别声明静态和默认方法。缺少静态和默认修饰符使得方法抽象。以下是具有所有三种类型方法的接口......
  • MySQL 面试突击指南:核心知识点解析2
    事务并发可能引发的问题MySQL是一个客户端/服务器架构的软件,对于同一个服务器来说,可以有多个客户端与之连接,每个客户端与服务器连接后,可以称为一个会话(Session)。每个客户端都可以在自己的会话中向服务器发出请求语句,一个请求语句可能是某个事务的一部分,也就是说,服务器可能......
  • 学生读书笔记共享系统-毕业设计-Springboot+mysql+Vue
    介绍学生读书笔记共享系统是一款专为学生设计的平台,旨在通过信息化手段实现读书笔记的共享和交流。系统分为管理端和用户端两个角色,分别为管理员和学生用户提供不同的功能模块,满足各自的需求。该系统不仅促进了学生之间的学习交流,还提升了学习效率和笔记管理的便捷性。技术栈......
  • Springboot计算机毕业设计自动答疑系统小程序【附源码】开题+论文+mysql+程序+部署
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着教育信息化的快速发展,学生对于知识获取和问题解决的需求日益增加。然而,传统的答疑方式,如面对面咨询或邮件回复,存在效率低下、资源分配不均等问题......
  • Java正则表达式
    Java正则表达式1.正则表达式是什么?正则表达式是用于匹配和操作文本模式的工具。它由字符和特殊元字符组成,能够实现强大的文本搜索、验证、替换等功能。2.正则表达式基本语法(1)匹配普通字符匹配数字[0123456789]简写为[0-9]匹配小写字母[a-z]匹配大写字母[A-Z]匹配大小......
  • 9.2JavaEE——JDBCTemplate的常用方法(一)excute()方法
    execute()方法用于执行SQL语句,其语法格式如下:jdTemplate.execute("SQL语句");下面以创建数据表的SQL语句为例,来演示excute()方法的使用,具体步骤如下。1、创建数据库        在MySQL中,创建一个名为spring的数据库。 mysql>createdatabasespring;QueryOK,1......
  • 手把手教你java CPU飙升300%如何优化
    背景今天有个项目运行一段时间后,cpu老是不堪负载。排查top命令TOP命令topt按cpu排序topm按内存使用率排序从上面看很快看出是pid4338这个进程资源消耗很高。top-Hppidtop-Hp4338找到对应线程消耗的资源shft+pcpu占用进行排序,shift+m按照内存排......
  • Java 超详细实现导入导出 (包含时间转换问题和样式)
    序言工作中遇到了导入导出问题,并且出现了导入或导出Excel时间格式变为数字的问题。通过学习解决实现了这些功能,记录总结分享给大家。本文将详细介绍如何使用Java编程语言和ApachePOI库来实现这些功能。我们将通过一个示例项目演示如何从数据库中读取数据并将其导出为Ex......
  • LangChain4j LangChain集成Java
    LangChain4j介绍github地址https://github.com/langchain4j快速开始引入依赖<dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-open-ai</artifactId><version>0.31.0</version></dependency&g......