MySQL 存储过程全面指南
摘要本文系统介绍 MySQL 存储过程的语法、数据类型、运算符、流程控制、参数传递和内置函数库帮助开发者掌握存储过程的完整知识体系。一、存储过程概述存储过程如同一门程序设计语言同样包含了数据类型、流程控制、输入和输出以及它自己的函数库。它是预编译的 SQL 语句集合存储在数据库中可以被多次调用提高代码复用性和执行效率。二、基本语法1. 创建存储过程CREATE PROCEDURE sp_name() BEGIN -- 存储过程体 ...... END2. 调用存储过程基本语法CALL sp_name()注意存储过程名称后面必须加括号即使该存储过程没有参数传递。3. 删除存储过程DROP PROCEDURE sp_name;注意事项不能在一个存储过程中删除另一个存储过程只能调用另一个存储过程。4. 其他常用命令SHOW PROCEDURE STATUS显示数据库中所有存储过程的基本信息包括所属数据库、存储过程名称、创建时间等。SHOW CREATE PROCEDURE sp_name显示某个 MySQL 存储过程的详细信息。三、数据类型与变量1. 基本数据类型MySQL 支持的标准数据类型INT、VARCHAR、DATE、DATETIME、DECIMAL 等。2. 变量声明与使用自定义变量DECLARE a INT; SET a 100; -- 或使用默认值 DECLARE a INT DEFAULT 100;变量分类用户变量以 开头在会话中有效系统变量分为会话级和全局级变量用户变量示例-- 在 MySQL 客户端使用 SELECT Hello World INTO x; SELECT x; SET y Goodbye Cruel World; SELECT y; SET z 1 2 3; SELECT z; -- 在存储过程中使用 CREATE PROCEDURE GreetWorld() SELECT CONCAT(greeting, World); SET greeting Hello; CALL GreetWorld(); -- 在存储过程间传递全局变量 CREATE PROCEDURE p1() SET last_procedure p1; CREATE PROCEDURE p2() SELECT CONCAT(Last procedure was , last_procedure); CALL p1(); CALL p2();3. 存储过程实战示例下面是一个完整的存储过程示例演示了变量声明、赋值、条件判断和结果输出的完整流程-- 创建一个计算员工奖金并分类的存储过程 DELIMITER $$ CREATE PROCEDURE CalculateEmployeeBonus( IN employee_id INT, -- 输入参数员工ID IN base_salary DECIMAL(10,2), -- 输入参数基本工资 OUT bonus_category VARCHAR(20) -- 输出参数奖金分类 ) BEGIN -- 声明局部变量 DECLARE performance_score INT DEFAULT 0; -- 绩效分数 DECLARE bonus_rate DECIMAL(5,2) DEFAULT 0.0; -- 奖金比例 DECLARE bonus_amount DECIMAL(10,2); -- 奖金金额 DECLARE years_of_service INT; -- 服务年限 -- 1. 变量赋值根据员工ID查询服务年限 SELECT DATEDIFF(CURDATE(), hire_date) DIV 365 INTO years_of_service FROM employees WHERE id employee_id; -- 2. 条件判断根据服务年限设置绩效分数 IF years_of_service lt; 1 THEN SET performance_score 60; -- 新员工 ELSEIF years_of_service lt; 3 THEN SET performance_score 75; -- 1-3年员工 ELSEIF years_of_service lt; 5 THEN SET performance_score 85; -- 3-5年员工 ELSE SET performance_score 95; -- 5年以上老员工 END IF; -- 3. 条件判断根据绩效分数设置奖金比例 CASE WHEN performance_score gt; 90 THEN SET bonus_rate 0.25; -- 优秀25% SET bonus_category 优秀; WHEN performance_score gt; 80 THEN SET bonus_rate 0.15; -- 良好15% SET bonus_category 良好; WHEN performance_score gt; 70 THEN SET bonus_rate 0.10; -- 合格10% SET bonus_category 合格; ELSE SET bonus_rate 0.05; -- 待改进5% SET bonus_category 待改进; END CASE; -- 4. 计算奖金金额 SET bonus_amount base_salary * bonus_rate; -- 5. 结果输出显示计算结果 SELECT employee_id AS 员工ID, base_salary AS 基本工资, years_of_service AS 服务年限(年), performance_score AS 绩效分数, bonus_rate AS 奖金比例, bonus_amount AS 奖金金额, bonus_category AS 奖金分类; -- 6. 记录日志可选 INSERT INTO bonus_log (employee_id, bonus_amount, category, calculated_at) VALUES (employee_id, bonus_amount, bonus_category, NOW()); END$$ DELIMITER ;示例调用与结果-- 调用存储过程 CALL CalculateEmployeeBonus(101, 8000.00, category); -- 查看输出参数 SELECT category AS 奖金分类结果;代码注释说明参数声明使用 IN、OUT 关键字定义输入输出参数明确数据流向。变量声明DECLARE 语句声明局部变量可指定数据类型和默认值。变量赋值SET 语句直接赋值SELECT...INTO 从查询结果赋值。条件判断IF...ELSEIF...ELSE 和 CASE...WHEN 两种条件结构根据业务逻辑分支处理。计算逻辑支持算术运算、函数调用等复杂计算。结果输出SELECT 语句返回结果集OUT 参数返回单个值。数据操作可在存储过程中执行 INSERT、UPDATE、DELETE 等 DML 操作。错误处理可扩展可使用 DECLARE...HANDLER 添加异常处理。实际应用场景薪资计算根据绩效、考勤等计算应发工资数据校验验证业务规则并返回校验结果批量处理循环处理大量数据并记录处理日志报表生成复杂统计逻辑封装为可重用的存储过程4. 性能优化与边界条件在实际使用存储过程时性能优化和边界条件处理是确保代码健壮性和高效性的关键。以下是一些针对 MySQL 存储过程的性能优化建议并结合CalculateEmployeeBonus示例分析其边界条件和潜在性能瓶颈。4.1 MySQL 存储过程性能优化建议合理使用临时表对于复杂的中间计算结果使用临时表可以避免重复计算。但要注意临时表的生命周期避免不必要的磁盘 I/O。避免过度循环尽量减少在存储过程中使用循环特别是嵌套循环。对于批量数据处理优先考虑基于集合的 SQL 操作。优化参数选择合理选择参数类型和大小避免使用过大的 VARCHAR 或不必要的精度。对于只读参数使用 IN 关键字对于输出参数使用 OUT 关键字。索引优化确保存储过程中查询的表都有合适的索引特别是 WHERE 子句和 JOIN 条件中使用的列。减少上下文切换尽量减少存储过程与应用程序之间的交互次数将多个操作合并到一个存储过程中执行。4.2 CalculateEmployeeBonus 示例的边界条件分析针对CalculateEmployeeBonus存储过程需要考虑以下边界条件输入参数为 NULL当employee_id或base_salary为 NULL 时存储过程应如何处理输入参数为负数base_salary为负数是否合理是否需要验证和拒绝员工不存在当查询的employee_id在employees表中不存在时SELECT...INTO语句会返回什么结果hire_date 为 NULL如果员工的hire_date字段为 NULLDATEDIFF函数会如何处理除零错误虽然当前示例没有除法运算但在其他存储过程中需要注意避免除零错误。4.3 CalculateEmployeeBonus 示例的改进建议基于上述分析可以对CalculateEmployeeBonus存储过程进行以下改进-- 改进版增加参数验证和错误处理 DELIMITER $$ CREATE PROCEDURE CalculateEmployeeBonus_Improved( IN employee_id INT, IN base_salary DECIMAL(10,2), OUT bonus_category VARCHAR(20), OUT error_message VARCHAR(100) ) BEGIN -- 参数验证 IF employee_id IS NULL THEN SET error_message 员工ID不能为空; SET bonus_category 错误; RETURN; END IF; IF base_salary IS NULL OR base_salary lt; 0 THEN SET error_message 基本工资必须为正数; SET bonus_category 错误; RETURN; END IF; -- 声明局部变量 DECLARE performance_score INT DEFAULT 0; DECLARE bonus_rate DECIMAL(5,2) DEFAULT 0.0; DECLARE bonus_amount DECIMAL(10,2); DECLARE years_of_service INT; DECLARE hire_date_val DATE; -- 1. 检查员工是否存在 SELECT hire_date INTO hire_date_val FROM employees WHERE id employee_id; IF hire_date_val IS NULL THEN SET error_message CONCAT(员工ID , employee_id, 不存在); SET bonus_category 错误; RETURN; END IF; -- 2. 计算服务年限增加NULL检查 SET years_of_service DATEDIFF(CURDATE(), hire_date_val) DIV 365; -- 3. 原有业务逻辑保持不变 IF years_of_service lt; 1 THEN SET performance_score 60; ELSEIF years_of_service lt; 3 THEN SET performance_score 75; ELSEIF years_of_service lt; 5 THEN SET performance_score 85; ELSE SET performance_score 95; END IF; CASE WHEN performance_score gt; 90 THEN SET bonus_rate 0.25; SET bonus_category 优秀; WHEN performance_score gt; 80 THEN SET bonus_rate 0.15; SET bonus_category 良好; WHEN performance_score gt; 70 THEN SET bonus_rate 0.10; SET bonus_category 合格; ELSE SET bonus_rate 0.05; SET bonus_category 待改进; END CASE; SET bonus_amount base_salary * bonus_rate; SET error_message 计算成功; -- 4. 结果输出 SELECT employee_id AS 员工ID, base_salary AS 基本工资, years_of_service AS 服务年限(年), performance_score AS 绩效分数, bonus_rate AS 奖金比例, bonus_amount AS 奖金金额, bonus_category AS 奖金分类, error_message AS 状态; -- 5. 记录日志 INSERT INTO bonus_log (employee_id, bonus_amount, category, calculated_at, status) VALUES (employee_id, bonus_amount, bonus_category, NOW(), error_message); END$$ DELIMITER ;4.4 潜在性能瓶颈与优化CalculateEmployeeBonus存储过程的潜在性能瓶颈及优化建议单行查询每次调用只处理一个员工对于批量计算效率较低。可考虑创建批量处理版本。缺乏索引确保employees表的id字段有索引以加速查询。日志表写入频繁调用时bonus_log表的写入可能成为瓶颈。可考虑批量写入或异步记录。计算复杂度当前计算逻辑简单但随着业务复杂化可能需要考虑缓存中间结果。通过以上优化可以使存储过程更加健壮、高效并更好地处理各种边界情况。五、存储过程调试与错误排查存储过程的调试和错误排查是开发过程中的重要环节。MySQL 提供了多种调试工具和技术帮助开发者快速定位和解决问题。1. 使用 SELECT 语句输出中间变量值进行调试最简单直接的调试方法是在存储过程中插入 SELECT 语句输出关键变量的值观察程序执行流程。-- 调试示例输出中间变量值 DELIMITER $$ CREATE PROCEDURE DebugExample( IN input_value INT, OUT result_value INT ) BEGIN DECLARE temp_value INT; DECLARE step_counter INT DEFAULT 1; -- 步骤1输出初始值 SELECT CONCAT(步骤, step_counter, : 输入值 , input_value) AS 调试信息; SET step_counter step_counter 1; -- 业务逻辑 SET temp_value input_value * 2; -- 步骤2输出计算中间结果 SELECT CONCAT(步骤, step_counter, : 临时值 , temp_value) AS 调试信息; SET step_counter step_counter 1; IF temp_value gt; 100 THEN SET result_value temp_value - 50; -- 步骤3输出条件分支信息 SELECT CONCAT(步骤, step_counter, : 进入大于100分支结果 , result_value) AS 调试信息; ELSE SET result_value temp_value 50; -- 步骤3输出条件分支信息 SELECT CONCAT(步骤, step_counter, : 进入小于等于100分支结果 , result_value) AS 调试信息; END IF; SET step_counter step_counter 1; -- 步骤4输出最终结果 SELECT CONCAT(步骤, step_counter, : 最终结果 , result_value) AS 调试信息; END$$ DELIMITER ; -- 调用调试示例 CALL DebugExample(60, result); SELECT result AS 计算结果;调试输出效果----------------------------------- | 调试信息 | ----------------------------------- | 步骤1: 输入值 60 | ----------------------------------- | 步骤2: 临时值 120 | ----------------------------------- | 步骤3: 进入大于100分支结果 70 | ----------------------------------- | 步骤4: 最终结果 70 | -----------------------------------2. 使用 SIGNAL 和 RESIGNAL 抛出自定义错误MySQL 5.5 支持 SIGNAL 语句可以在存储过程中抛出自定义错误提供更友好的错误信息。-- SIGNAL 示例参数验证和错误抛出 DELIMITER $$ CREATE PROCEDURE ValidateAndProcess( IN user_id INT, IN amount DECIMAL(10,2) ) BEGIN DECLARE user_exists INT DEFAULT 0; DECLARE current_balance DECIMAL(10,2) DEFAULT 0; -- 参数验证 IF user_id IS NULL OR user_id lt; 0 THEN SIGNAL SQLSTATE 45000 SET MESSAGE_TEXT 用户ID必须为正整数; END IF; IF amount IS NULL OR amount lt; 0 THEN SIGNAL SQLSTATE 45000 SET MESSAGE_TEXT 金额必须为正数; END IF; -- 检查用户是否存在 SELECT COUNT(*) INTO user_exists FROM users WHERE id user_id; IF user_exists 0 THEN SIGNAL SQLSTATE 45001 SET MESSAGE_TEXT CONCAT(用户ID , user_id, 不存在); END IF; -- 检查余额是否充足 SELECT balance INTO current_balance FROM accounts WHERE user_id user_id; IF current_balance lt; amount THEN SIGNAL SQLSTATE 45002 SET MESSAGE_TEXT CONCAT(余额不足当前余额, current_balance); END IF; -- 正常业务逻辑 UPDATE accounts SET balance balance - amount WHERE user_id user_id; INSERT INTO transactions (user_id, amount, transaction_type, created_at) VALUES (user_id, amount, PAYMENT, NOW()); SELECT 交易成功 AS result; END$$ DELIMITER ; -- 测试错误抛出 CALL ValidateAndProcess(NULL, 100); -- 抛出用户ID必须为正整数 CALL ValidateAndProcess(999, -50); -- 抛出金额必须为正数 CALL ValidateAndProcess(999, 100); -- 抛出用户ID 999 不存在假设用户不存在3. 使用 SHOW WARNINGS 查看警告信息SHOW WARNINGS 可以显示存储过程执行过程中产生的警告信息帮助发现潜在问题。-- 警告信息示例 DELIMITER $$ CREATE PROCEDURE ShowWarningsExample() BEGIN DECLARE x INT DEFAULT 1; DECLARE y INT DEFAULT 0; DECLARE result DECIMAL(10,2); -- 可能产生除零警告的操作 SET result x / y; -- 这里会产生警告 -- 数据截断警告 DECLARE short_text VARCHAR(5) DEFAULT Hello World; -- 截断警告 -- 插入可能重复的数据 INSERT IGNORE INTO test_table (id, name) VALUES (1, Test); SELECT 过程执行完成 AS status; END$$ DELIMITER ; -- 调用并查看警告 CALL ShowWarningsExample(); SHOW WARNINGS;SHOW WARNINGS 输出示例---------------------------------------------------------- | Level | Code | Message | ---------------------------------------------------------- | Warning | 1365 | Division by 0 | | Warning | 1265 | Data truncated for column short_text | | Note | 1062 | Duplicate entry 1 for key PRIMARY | ----------------------------------------------------------4. 使用 MySQL Workbench 或命令行工具调试存储过程4.1 MySQL Workbench 调试步骤打开存储过程在左侧导航栏找到目标数据库 → Stored Procedures → 右键点击存储过程 → Alter Stored Procedure。设置断点在代码编辑器中点击行号左侧区域设置断点红色圆点。启动调试点击工具栏的调试按钮虫子图标或按 F5。观察变量在调试面板中查看局部变量、用户变量的值变化。单步执行使用 F10跳过、F11进入控制执行流程。查看调用栈在 Call Stack 面板查看函数调用层次。4.2 命令行工具调试实战-- 步骤1创建带调试输出的存储过程 DELIMITER $$ CREATE PROCEDURE DebugWithCommandLine( IN start_value INT, OUT final_result INT ) BEGIN DECLARE counter INT DEFAULT start_value; DECLARE sum_value INT DEFAULT 0; -- 调试输出开始信息 SELECT CONCAT(开始执行初始值, start_value) AS 调试信息; WHILE counter gt; 0 DO SET sum_value sum_value counter; SET counter counter - 1; -- 每5次循环输出一次进度 IF counter % 5 0 THEN SELECT CONCAT(循环中counter, counter, , sum, sum_value) AS 进度信息; END IF; END WHILE; SET final_result sum_value; -- 调试输出最终结果 SELECT CONCAT(执行完成最终结果, final_result) AS 调试信息; END$$ DELIMITER ; -- 步骤2调用存储过程并观察输出 CALL DebugWithCommandLine(10, result); -- 步骤3查看输出参数 SELECT result AS 计算结果; -- 步骤4查看最近执行的SQL语句如果有general_log -- SHOW VARIABLES LIKE general_log%; -- SET GLOBAL general_log 1; -- 开启通用查询日志调试后记得关闭4.3 实用调试技巧临时调试表创建临时表记录执行日志-- 创建调试日志表 CREATE TABLE IF NOT EXISTS sp_debug_log ( id INT AUTO_INCREMENT PRIMARY KEY, procedure_name VARCHAR(100), step_number INT, debug_message TEXT, variable_values JSON, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 在存储过程中插入调试日志 DELIMITER $$ CREATE PROCEDURE DebugWithLogTable() BEGIN DECLARE var1 INT DEFAULT 10; DECLARE var2 VARCHAR(50) DEFAULT test; -- 记录步骤1 INSERT INTO sp_debug_log (procedure_name, step_number, debug_message, variable_values) VALUES (DebugWithLogTable, 1, 开始执行, JSON_OBJECT(var1, var1, var2, var2)); -- 业务逻辑 SET var1 var1 * 2; -- 记录步骤2 INSERT INTO sp_debug_log (procedure_name, step_number, debug_message, variable_values) VALUES (DebugWithLogTable, 2, 变量计算后, JSON_OBJECT(var1, var1, var2, var2)); -- 更多业务逻辑... -- 记录完成 INSERT INTO sp_debug_log (procedure_name, step_number, debug_message) VALUES (DebugWithLogTable, 99, 执行完成); SELECT 过程执行完成查看sp_debug_log表获取详细日志 AS result; END$$ DELIMITER ; -- 调用并查看日志 CALL DebugWithLogTable(); SELECT * FROM sp_debug_log WHERE procedure_name DebugWithLogTable ORDER BY step_number;总结存储过程调试需要结合多种方法。简单问题使用 SELECT 输出复杂逻辑使用 SIGNAL 抛出明确错误性能问题使用 SHOW WARNINGS 查看警告复杂流程使用 MySQL Workbench 或日志表进行详细跟踪。根据实际情况选择合适的调试策略可以大大提高开发效率。

相关新闻

无Root环境下的终极Android模块化方案:LSPatch框架深度解析与实践指南

无Root环境下的终极Android模块化方案:LSPatch框架深度解析与实践指南

无Root环境下的终极Android模块化方案:LSPatch框架深度解析与实践指南 【免费下载链接】LSPatch LSPatch: A non-root Xposed framework extending from LSPosed 项目地址: https://gitcode.com/gh_mirrors/ls/LSPatch 在Android生态系统中,模块化…

2026/9/25 16:56:27 阅读更多 →
快速解决iPhone USB网络共享驱动问题:Windows用户完整指南

快速解决iPhone USB网络共享驱动问题:Windows用户完整指南

快速解决iPhone USB网络共享驱动问题:Windows用户完整指南 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitcode.com/gh…

2026/10/13 8:20:54 阅读更多 →
深度解析:微信数据库AES-256-CBC加密机制与WechatDecrypt技术揭秘

深度解析:微信数据库AES-256-CBC加密机制与WechatDecrypt技术揭秘

深度解析:微信数据库AES-256-CBC加密机制与WechatDecrypt技术揭秘 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt 微信消息解密工具WechatDecrypt为技术开发者和数据安全爱好者提供了一个深入…

2026/10/9 18:40:13 阅读更多 →

最新新闻

TCP粘包与半包问题的三种生产级解决方案

TCP粘包与半包问题的三种生产级解决方案

1. 项目概述:为什么“粘包”和“半包”是网络编程里最常被低估的坑你写完一个TCP服务端,本地测试一切正常,一上测试环境就发现客户端收不到完整消息,或者一条消息被拆成两段、三段,甚至几条消息黏在一起发过来——日志…

2026/10/14 22:12:34 阅读更多 →
AB实验中的新奇效应与改变厌恶:识别与规避指南

AB实验中的新奇效应与改变厌恶:识别与规避指南

做实验的人最怕的不是“没效果”,而是“看起来有效果,推全之后又没了”。我见过太多团队兴冲冲把新版全量上线,一周后核心指标跌回老版水平,甚至更差。复盘时发现,问题往往不在方案本身,而在两个非常隐蔽的…

2026/10/14 22:12:34 阅读更多 →
重复ACK与RACK:传输层丢包检测机制配合与调优实战

重复ACK与RACK:传输层丢包检测机制配合与调优实战

1. 从一个让人抓狂的传输现象说起做网络协议调优的人,几乎都遇到过这样一种场景:明明链路带宽没跑满,发送端却像被踩了刹车一样,速度死活上不去;抓包一看,满屏都是重复ACK,偶尔还夹杂着几个RACK…

2026/10/14 22:12:34 阅读更多 →
AB实验中的两大隐形杀手:新奇效应与改变厌恶解析

AB实验中的两大隐形杀手:新奇效应与改变厌恶解析

做实验做得久了,难免会遇上一些“打脸”时刻。明明上线前评估时觉得十拿九稳的改动,实验结果却给你当头一棒;更常见的是,同一个改动,月初开实验效果正向显著,月底再开一次却变成了负向甚至不显著。这时候很…

2026/10/14 22:12:34 阅读更多 →
AI原生应用隐私保护实战:从数据收集到模型遗忘的完整链路

AI原生应用隐私保护实战:从数据收集到模型遗忘的完整链路

去年底我们团队扎扎实实做了一轮数据安全改造,起因很简单:一个AI原生的智能助手在灰度期间,被安全团队发现输入日志里完整记录了用户的身份证号。这是我第一次真正意识到,AI原生应用的隐私保护和传统App完全是两码事——传统App把…

2026/10/14 22:12:34 阅读更多 →
中美AI差距从15%降到3%?别被基准测试分数骗了

中美AI差距从15%降到3%?别被基准测试分数骗了

1. 那个3%到底在说什么第一次看到“中美AI差距从15%降到3%”这个说法,我的反应和大多数人一样:要么是标题党,要么是某个机构为了流量硬造出来的数字。但仔细扒了一圈之后发现,这个数字确实有出处,也确实有人在认真算&a…

2026/10/14 22:11:32 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →