数据库的函数、存储过程、触发器详解

一.变量

1.系统变量  global session

2.用户自定义变量

1.不用提前声明,使用时直接''  @变量名      ''

2.set @name='lisi';

set 字段名 into @name from 表名

3.局部变量

1.需要用declare声明

2.declare 变量名 类型 

3.set 变量名=值

二.触发器

.1函数

DELIMITER $$USE `shujuku`$$DROP FUNCTION IF EXISTS `PysxCx`$$CREATE DEFINER=`root`@`localhost` FUNCTION `PysxCx`(zw VARCHAR(20)) RETURNS VARCHAR(20) CHARSET utf8mb4READS SQL DATA
BEGINSET @pysx='';SET @l=CHAR_LENGTH(zw);SET @i=1;WHILE (@i<=@l) DOSELECT jp INTO @jp FROM hzpyb  WHERE hz=SUBSTR(zw,@i,1);SET @pysx=CONCAT(@pysx,@jp);SET @i=@i+1;END WHILE;    RETURN @pysx;END$$DELIMITER ;

                                      触发器1

DELIMITER $$USE `shujuku`$$DROP TRIGGER `Update_mcsx_before_insert_goods`$$CREATETRIGGER `Update_mcsx_before_insert_goods` BEFORE INSERT ON `goods` FOR EACH ROW BEGIN   SET new.abbreviations=pysxcx(new.gname);    
END;
$$DELIMITER ;

                                     触发器2

DELIMITER $$USE `shujuku`$$DROP TRIGGER `Update_mcsx_before_update_goods_gname`$$CREATETRIGGER `Update_mcsx_before_update_goods_gname` BEFORE UPDATE ON `goods` FOR EACH ROW BEGIN    IF new.gname<>old.gname THEN      SET new.abbreviations=pysxcx(new.gname);     END IF;    
END;
$$DELIMITER ;

2超市购买物品

goodswh

DELIMITER $$USE `shujuku`$$DROP PROCEDURE IF EXISTS `goodswh`$$CREATE DEFINER=`root`@`localhost` PROCEDURE `goodswh`(gid INT,gname VARCHAR(20),unit VARCHAR(20),barcode VARCHAR(20),retail_Price DECIMAL(10,2),promotional_Price DECIMAL(10,2),STATUS TINYINT)
BEGINIF gid=0 THENINSERT INTO goods(gname,unit,barcode,retail_Price,promotional_Price,STATUS) VALUES (gname,unit,barcode,retail_Price,promotional_Price,STATUS);ELSEIF gid>0 THENUPDATE  goods SET goods.gname=gname, goods.unit=unit, goods.barcode=barcode, goods.retail_Price=retail_Price, goods.promotional_Price=promotional_Price, goods.STATUS=STATUS WHERE  goods.gid=gid;ELSEDELETE FROM goods WHERE  goods.gid=-gid;END IF;END$$DELIMITER ;

goodscx

DELIMITER $$USE `shujuku`$$DROP PROCEDURE IF EXISTS `goodscx`$$CREATE DEFINER=`root`@`localhost` PROCEDURE `goodscx`(gid INT)
BEGINIF gid=0 THENSELECT * FROM goods;ELSESELECT * FROM goods  WHERE goods.gid=gid;END IF;
END$$DELIMITER ;

 删除触发器

DELIMITER $$USE `shujuku`$$DROP TRIGGER /*!50032 IF EXISTS */ `delete_from_stock_after_delete_goods`$$CREATE/*!50017 DEFINER = 'root'@'localhost' */TRIGGER `delete_from_stock_after_delete_goods` BEFORE DELETE ON `goods` FOR EACH ROW BEGIN	DELETE FROM stock WHERE gid=old.gid;   
END;
$$DELIMITER ;

 11.超市存储过程

DELIMITER $$USE `shujuku`$$DROP PROCEDURE IF EXISTS `Xsjlcp_new`$$CREATE DEFINER=`root`@`localhost` PROCEDURE `Xsjlcp_new`(cashierid INT, uid INT, payment TINYINT, xsmx VARCHAR(8000))
BEGINDECLARE amount_money DECIMAL(18,3);DECLARE actual_money DECIMAL(18,3);DECLARE discount_money DECIMAL(18,3);-- 如果存在名为 lsb 的表,则删除它DROP TEMPORARY TABLE IF EXISTS lsb;-- 创建临时表 lsb,包含 gid 和 xssl 两个字段CREATE TEMPORARY TABLE lsb (gid INT, xssl NUMERIC(18,3));-- 使用 WHILE 循环解析 xsmx 中的数据并插入到 lsb 表中WHILE (xsmx > '') DOSET @k = POSITION(',' IN xsmx);SET @gid = LEFT(xsmx, @k - 1);SET xsmx = SUBSTR(xsmx, @k + 1);SET @k = POSITION(',' IN xsmx);SET @xssl = LEFT(xsmx, @k - 1);INSERT INTO lsb(gid, xssl) VALUES(@gid, @xssl);SET xsmx = SUBSTR(xsmx, @k + 1);END WHILE;-- 计算总金额和实际金额SELECT SUM(xssl * retail_Price) INTO amount_money FROM lsb, goods WHERE lsb.gid = goods.gid;SELECT SUM(xssl * promotional_Price) INTO actual_money FROM lsb, goods WHERE lsb.gid = goods.gid;SET discount_money = amount_money - actual_money;-- 插入收银记录到 cashaccount 表INSERT INTO cashaccount(cashierid, uid, payment, amount_money, actual_money, discount_money)VALUES (cashierid, uid, payment, amount_money, actual_money, discount_money);-- 插入销售明细到 cashaccount_detail 表INSERT INTO cashaccount_detail(cashaccountid, gid, salesquantity, retailprice, promotionalprice)SELECT LAST_INSERT_ID(), lsb.gid, xssl, retail_Price, promotional_Price FROM lsb, goods WHERE lsb.gid = goods.gid;-- 更新库存UPDATE stock s JOIN lsb ON s.gid = lsb.gid SET s.quantity = s.quantity - lsb.xssl;-- 如果 uid 大于等于 10000,则更新用户的卡余额和积分IF uid >= 10000 THENUPDATE `user` SET card_balance = card_balance - actual_money, points = points + FLOOR(actual_money)WHERE uid = uid;END IF;-- 删除临时表 lsbDROP TEMPORARY TABLE IF EXISTS lsb;END$$DELIMITER ;

3.xkglxt

1.实现学生表的插入,需要判断当前学号学生是否存在

DELIMITER $$USE `myspj`$$DROP PROCEDURE IF EXISTS `insert_Student`$$CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_Student`(IN Studentid INT ,IN Studentname VARCHAR(10))
BEGINDECLARE StudentExists INT ;SELECT COUNT(*) INTO StudentExistsFROM Student WHERE id=Studentid;IF StudentExists > 0 THEN SELECT '学号存在,学生信息插入失败' ;ELSEINSERT INTO Student(id,`name`) VALUES (Studentid,Studentname);SELECT '学生信息插入成功';END IF;END$$DELIMITER ;

2.实现选课表的插入,需要判断当前课程id和学生id是否存在

DELIMITER $$USE `myspj`$$DROP PROCEDURE IF EXISTS `insert_xuanke`$$CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_xuanke`(IN _xid INT, IN _id INT, IN _kid INT, IN _chengji INT)
BEGIN    DECLARE studentExists INT DEFAULT 0;    DECLARE courseExists INT DEFAULT 0;    SELECT COUNT(*) INTO studentExists   FROM Student WHERE id = _id;    IF studentExists = 0 THEN    SELECT '学生id不存在' AS result;  END IF;  SELECT COUNT(*) INTO courseExists   FROM kecheng WHERE kid = _kid;  IF courseExists = 0 THEN    SELECT '课程id不存在' AS result;  ELSE    -- 检查学生是否已经选了这门课程  IF NOT EXISTS (SELECT 1 FROM xuanke WHERE kid = _kid AND id = _id) THEN    INSERT INTO xuanke (xid, id, kid, chengji) VALUES (_xid, _id, _kid, _chengji);    SELECT '插入成功' AS result;  ELSE    SELECT '学生已选该课程';    END IF;    END IF;  
END$$DELIMITER ;

4.订单延期

将顾客表上余额不足1000元的,将订单日期延后10天

UPDATE orders
SET DATE = DATE_ADD(DATE, INTERVAL 10 DAY)
WHERE orders.gid IN (SELECT gidFROM customersWHERE balance < 1000
);

将商品表中没有顾客订购的商品信息删除

DELETE FROM goods
WHERE goods.`sid` NOT IN (
SELECT DISTINCT orders.`sid` FROM orders
)

5.建立索引

 CREATE INDEX sname ON `student`(`studentname`);CREATE INDEX qanswer  ON `questionbank`(`questionAnswer`(1000));

6.当插入、删除试题时,修改章节表的试题数量

DELIMITER $$CREATETRIGGER `network_course`.`insert_from_questionbank_after_add_chapter` AFTER UPDATEON `network_course`.`questionbank`FOR EACH ROW BEGINUPDATE chapter SET `questioncount`=`questioncount`+1WHERE `chapterid`=new.`chapterid`;END$$DELIMITER ;

7.写出插入一条学生数据的存储过程

DELIMITER $$CREATEPROCEDURE `network_course`.`insert_one_student`(IN snum VARCHAR(20),IN sname VARCHAR(20),IN spw VARCHAR(20),IN cid INT)BEGINDECLARE count1 INT;SELECT COUNT(*) INTO count1FROM student WHERE `studentnum`=snum;IF count1=0 THENINSERT INTO student(`studentnum`,`studentname`,`studentpw`,`classid`)VALUES(snum,sname,spw,cid);END IF;END$$DELIMITER ;

8.写出一次插入多条学生数据的存储过程

  • 学生数据的格式为:

“学号1,姓名1,密码1,班级号1;学号2,姓名2,密码2,班级号2;”

例如:

"201451080102,张三,NULL,1;201451080103,李四,NULL,1;"

CALL insert_many_student("221451080608,张1,NULL,1;221451080609,李1,NULL,1;");

CAST( 字符串 AS SIGNED);  将字符串类型的数字转化为数字类型的数字

在MySQL中,MID()函数用于返回一个字符串中从指定位置开始的指定长度的子字符串。其语法为:
MID(str, start, length)
str为要从中提取子字符串的原始字符串。
start为要开始提取子字符串的位置(位置从1开始)。
length为要提取的子字符串的长度
在MySQL中,LOCATE()函数用于在一个字符串中查找子字符串,并返回子字符串第一次出现的位置。其语法为:
LOCATE(substring, string, start)
substring为要查找的子字符串。
string为要在其中查找子字符串的原始字符串。
start为可选参数,表示从原始字符串的某个位置开始查找。如果不指定start,则默认从字符串的第一个字符开始查找。

DELIMITER $$CREATEPROCEDURE `network_course`.`insert_many_student`(IN stustr VARCHAR(5000))BEGINDECLARE str1 VARCHAR(200);DECLARE num0 VARCHAR(20);DECLARE name0 VARCHAR(20);DECLARE PW0 VARCHAR(20);DECLARE classid0 INT ;DECLARE flag INT;WHILE stustr>' ' DOSET str1 = MID(stustr,1,LOCATE(';',stustr)-1);SET num0 = MID(str1,1,LOCATE(',',str1)-1);SET str1 = MID(str1,LOCATE(',',str1)+1);SET name0 = MID(str1,1,LOCATE(',',str1)-1);SET str1 = MID(str1,LOCATE(',',str1)+1);SET pw0 = MID(str1,1,LOCATE(',',str1)-1);SET classid0 =CAST(MID(str1,LOCATE(',',str1)+1) AS SIGNED);CALL `insert_one_student`(num0,name0,pw0,classid0);SET stustr= MID(stustr,LOCATE(';',stustr)+1);END WHILE ;END$$DELIMITER ;

9.生成学生试卷

输入参数:学生帐号,按照规则生成学生试卷总表以及试卷明细表

DELIMITER $$USE `network_course`$$DROP PROCEDURE IF EXISTS `insert_exam`$$CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_exam`(IN studentid0 INT)
BEGINDECLARE examid0 INT;DECLARE fromc0 INT;DECLARE toc0 INT;DECLARE type0 INT;DECLARE  diff0 INT;DECLARE c0 INT;DECLARE done INT DEFAULT FALSE;DECLARE cur CURSOR FOR SELECT `fromchapterid`,`tochapterid`,`type`, `difficulty`, `count`FROM exam_rule ORDER BY exam_ruleid;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done= TRUE;SELECT COUNT(*)INTO c0 FROM exam WHERE studentid=studentid0;IF c0=0 THENINSERT INTO exam(studentid,state,score)VALUES(studentid0,0,0);SELECT LAST_INSERT_ID()INTO examid0;OPEN cur;FETCH cur INTO fromc0,toc0,type0,diff0,c0;WHILE(NOT done) DO INSERT INTO exam_detail(examid,questionid,answer ,grade)SELECT examid0 AS examid,questionid,'' AS answer,0 AS gradeFROM questionbank WHERE chapterid>=fromc0 AND chapterid<=toc0AND `type`=type0 AND difficulty=diff0 ORDER BY RAND() LIMIT c0;FETCH cur INTO fromc0,toc0,type0,diff0,c0;END WHILE;CLOSE cur;END IF;END$$DELIMITER ;

10.生成班级试卷

输入参数:班级ID,按照规则生成班级所有学生的试卷总表以及试卷明细表

DELIMITER $$CREATEPROCEDURE `network_course`.`insert_exam0`(IN classid0 INT)BEGINDECLARE examid0 INT;DECLARE stuid0 INT;DECLARE done INT DEFAULT FALSE;DECLARE	cur CURSOR FOR SELECT studentid FROM studentWHERE classid=classid0;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done= TRUE;OPEN cur;FETCH cur INTO stuid0;WHILE(NOT done)DOCALL insert_exam (stuid0);FETCH cur INTO stuid0;END WHILE;CLOSE cur;END$$DELIMITER ;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/12562.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

点云算法源代码及解析专栏目录

1、轮廓线提取及简化 1.1 道格拉斯普克算法(DP)的点云轮廓线简化-CSDN博客 1.2 alpha shapes提取边缘点函数调用&#xff08;API&#xff09; 1.3 基于KNN-凸包提取轮廓点&#xff08;matlab&#xff09; 1.4 基于公共转点的Alpha shapes有序边缘点提取 1.5 一元线性回…

kylin 使用心得

Kylin操作系统是一种基于Linux的操作系统&#xff0c;主要在中国使用&#xff0c;由中国国内的开发团队维护。它的目标是为了提供一个稳定、安全、易于使用的操作环境。以下是一些用户可能基于Kylin操作系统的使用心得&#xff1a; 1. **界面友好**&#xff1a;Kylin操作系统通…

查看Linux系统是Ubuntu还是CentOS

要查看Linux系统是Ubuntu还是CentOS&#xff0c;可以通过多种方式进行确认&#xff1a; 查看/etc/os-release文件&#xff1a; 在终端中执行以下命令&#xff1a; cat /etc/os-release 如果输出中包含"IDubuntu"&#xff0c;则表示系统是Ubuntu&#xff1b;如果输出中…

windows驱动开发-PCI和中断(二)

谈到中断使用PCI总线来作为例子是最合适的&#xff0c;在Windows发展过程中&#xff0c;PCI作为最成功的底层总线&#xff0c;集成了大量的外设&#xff0c;不夸张的说&#xff0c;目前PCI几乎是唯一的总线选择&#xff0c;故大部分情况下&#xff0c;只有PCI设备驱动程序会遇到…

java项目之企业资产管理系统(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的企业资产管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 管理员功能有个人中心&…

SQL Server (MSSQLSERVER) 服务无法启动

解决方法&#xff1a; 打开服务&#xff0c;右键SQL Server (MSSQLSERVER) ->属性->登录&#xff0c;改为本地系统用户

小果网页---套利系统添加了可以套利模块,提供数据api

最近在小果套利系统里面添加了一下可以套利模块&#xff0c;同时实现了盘中自动更新&#xff0c;30分钟更新一次。给大家提交交易参考&#xff0c;可以套利模块的选择 dfdf[df[申购状态] !暂停申购]dfdf[df[申购限额] !无限额]df[溢价率]df[溢价率].astype(float)df[成交量]df…

echarts getZr 点击区分柱状图和图例

mCharts.getZr().on(click, function (params) { var pointInPixel [params.offsetX, params.offsetY]; if (mCharts.containPixel(grid, pointInPixel)) { console.log(柱子) } else { console.log(图例) } })

Oracle镇压重复行的sql

在Oracle数据库中&#xff0c;如果你想要查询时不返回重复的行&#xff0c;你可以使用DISTINCT关键字。但是&#xff0c;如果你想要“镇压”或删除表中的重复行&#xff0c;你需要进行一些不同的操作。 以下是一些常见的方法来处理重复的行&#xff1a; 使用DISTINCT查询不重复…

Nginx的正向代理与反向代理

你好呀&#xff0c;我是赵兴晨&#xff0c;文科程序员。 今天&#xff0c;我们将一起了解什么是Nginx的正向代理&#xff1f;什么是Nginx的反向代理&#xff1f;并实际动手实践。 以下内容都是满满的干货&#xff0c;绝对不容错过。我建议先收藏这篇文章&#xff0c;然后找一…

无锁消息队列的设计实现

无锁队列的需求分析&#xff1a; 多线程访问共享队列的数据时&#xff0c;必须确保对共享队列操作的原子性&#xff0c;有以下情况&#xff1a; 1.生产者&#xff0c;例如tcp服务器接收到请求信息&#xff0c;需要将请求信息push进共享队列 2.消费者&#xff0c;例如线程池的…

项目管理-案例重点知识(整合管理)

项目管理&#xff1a;每天进步一点点~ 活到老&#xff0c;学到老 ヾ(◍∇◍)&#xff89;&#xff9e; 何时学习都不晚&#xff0c;加油 一、整合管理 案例重点 重点内容&#xff1a; &#xff08;1&#xff09;项目章程内容和作用 &#xff08;2&#xff09;项目管理计划…

linux系统介绍和安装教程(含安装链接放在最下面了)

一、linux系统简介 在Linux和C语言的发展历程中&#xff0c;有几位关键人物为它们的诞生和推广做出了重要贡献。 首先&#xff0c;肯汤姆森&#xff08;Ken Thompson&#xff09;是一位在AT&T公司工作的员工&#xff0c;他不仅发明了B语言&#xff0c;还创造了Unix系统。…

python怎么读取xml

引入XML组件&#xff1a;import xml.dom.minidom。 创建一个xml文件&#xff0c;<?xml version"1.0" encoding"utf-8"?>。 加载读取XML文件&#xff0c;xml.dom.minidom.parse(abc.xml)&#xff0c;这是xml文件的对象。 获取XML文档对象&#xff0…

c++ vector容器

在C中&#xff0c;vector 是一个动态数组&#xff0c;它可以根据需要自动增长和缩小。以下是对vector的基本概念和常用操作的详细解释&#xff1a; vector基本概念 vector 是一个模板类&#xff0c;它提供了对动态数组的封装。你可以用它来存储任何类型的对象&#xff0c;并自…

657. 机器人能否返回原点

657. 机器人能否返回原点 题目链接&#xff1a;657. 机器人能否返回原点 代码如下&#xff1a; class Solution { public:bool judgeCircle(string moves) {int x0,y0;for(int i0;i<moves.size();i){if(moves[i]U) y--;if(moves[i]D) y;if(moves[i]L) x--;if(moves…

【华为OD机试C卷D卷】数字排列(C++/Java/Python)

题目描述 小明负责公司年会,想出一个趣味游戏: 屏幕给出 1 ~ 9 中任意 4 个不重复的数字,大家以最快时间给出这几个数字可拼成的数字从小到大排列位于第 N 位置的数字,其中 N 为给出数字中最大的(如果不到这么多数字则给出最后一个即可)。 注意: 2 可以当作 5 来使用…

RT-DETR改进教程|加入SCNet中的SCConv[CVPR2020]自校准卷积模块!

⭐⭐ RT-DETR改进专栏|包含主干、模块、注意力机制、检测头等前沿创新 ⭐⭐ 一、 论文介绍 论文链接&#xff1a;http://mftp.mmcheng.net/Papers/20cvprSCNet.pdf 代码链接&#xff1a;https://gitcode.com/MCG-NKU/SCNet/ 文章摘要&#xff1a; CNN的最新进展主要致力于设计更…

微信小程序 - - - - - custom-tab-bar使用自定义tabbar

custom-tab-bar使用自定义tabbar 1. 创建custom-tab-bar组件2. 修改app.json3. tabbar对应页面调整 1. 创建custom-tab-bar组件 各个文件代码如下 /custom-tab-bar/data.js export default [{text: 流水笺,iconPath: /assets/icon/bill.png,selectedIconPath: /assets/icon/bi…

huggingface datasets离线加载文件的解决方案

介绍 Hugging Face Datasets是一个用于加载和处理自然语言处理&#xff08;NLP&#xff09;和计算机视觉&#xff08;CV&#xff09;数据集的库。它提供了一种统一的API来访问各种数据集&#xff0c;包括来自Hugging Face Hub、本地文件和远程URL。 然而&#xff0c;在离线环…