MySQL存储程序入门指南

1、MySQL 全面指南:从入门到高级应用 本博客是一份全面的 MySQL 学习指南,从入门到高级应用均有详细讲解。内容涵盖 MySQL 基础操作、SQL 数据管理、数据类型、存储程序、查询优化等核心主题,帮助读者掌握数据库设计与管理技能,并提升数据库性能与安全性。适用于初学者和有一定基础的开发者深入学习 MySQL 的高级特性。 阅读详情
1,前提
需要MySQL 5

2,Hello World
MySQL存储过程之Hello World
Java代码 复制代码
  1. DELIMITER $$  
  2.   
  3. DROP PROCEDURE IF EXISTS HelloWorld$$  
  4. CREATE PROCEDURE HelloWorld()  
  5. BEGIN  
  6.     SELECT "Hello World!";  
  7. END$$  
  8.   
  9. DELIMITER ;  
DELIMITER $$

DROP PROCEDURE IF EXISTS HelloWorld$$
CREATE PROCEDURE HelloWorld()
BEGIN
    SELECT "Hello World!";
END$$

DELIMITER ;


3,变量
使用 DECLARE来声明, DEFAULT赋默认值, SET赋值
Java代码 复制代码
  1. DECLARE counter INT DEFAULT 0;  
  2. SET counter = counter+1;  
DECLARE counter INT DEFAULT 0;
SET counter = counter+1;


4,参数
IN为默认类型,值必须在调用时指定,值不能返回(值传递)
OUT值可以返回(指针传递)
INOUT值必须在调用时指定,值可以返回
Java代码 复制代码
  1. CREATE PROCEDURE test(a INT, OUT b FLOAT, INOUT c INT)  
CREATE PROCEDURE test(a INT, OUT b FLOAT, INOUT c INT)


5,条件判断
IF THEN、 ELSEIF、 ELSE、 END IF
Java代码 复制代码
  1. DELIMITER $$  
  2.   
  3. DROP PROCEDURE IF EXISTS discounted_price$$  
  4. CREATE PROCEDURE discunted_price(normal_price NUMERIC(8, 2), OUT discount_price NUMERIC(8, 2))  
  5. BEGIN  
  6.     IF (normal_price > 500) THEN  
  7.         SET discount_price = normal_price * .8;  
  8.     ELSEIF (normal_price > 100) THEN  
  9.         SET discount_price = normal_price * .9;  
  10.     ELSE  
  11.         SET discount_price = normal_price;  
  12.     END IF;  
  13. END$$  
  14.   
  15. DELIMITER ;  
DELIMITER $$

DROP PROCEDURE IF EXISTS discounted_price$$
CREATE PROCEDURE discunted_price(normal_price NUMERIC(8, 2), OUT discount_price NUMERIC(8, 2))
BEGIN
    IF (normal_price > 500) THEN
        SET discount_price = normal_price * .8;
    ELSEIF (normal_price > 100) THEN
        SET discount_price = normal_price * .9;
    ELSE
        SET discount_price = normal_price;
    END IF;
END$$

DELIMITER ;


6,循环
LOOP、 END LOOP
Java代码 复制代码
  1. DELIMITER $$  
  2.   
  3. DROP PROCEDURE IF EXISTS simple_loop$$  
  4.   
  5. CREATE PROCEDURE simple_loop(OUT counter INT)  
  6. BEGIN  
  7.     SET counter = 0;  
  8.     my_simple_loop: LOOP  
  9.         SET counter = counter+1;  
  10.         IF counter = 10 THEN  
  11.             LEAVE my_simple_loop;  
  12.         END IF;  
  13.     END LOOP my_simple_loop;  
  14. END$$  
  15.   
  16. DELIMITER ;  
DELIMITER $$

DROP PROCEDURE IF EXISTS simple_loop$$

CREATE PROCEDURE simple_loop(OUT counter INT)
BEGIN
    SET counter = 0;
    my_simple_loop: LOOP
        SET counter = counter+1;
        IF counter = 10 THEN
            LEAVE my_simple_loop;
        END IF;
    END LOOP my_simple_loop;
END$$

DELIMITER ;

WHILE DO、 END WHILE
Java代码 复制代码
  1. DELIMITER $$  
  2.   
  3. DROP PROCEDURE IF EXISTS simple_while$$  
  4.   
  5. CREATE PROCEDURE simple_while(OUT counter INT)  
  6. BEGIN  
  7.     SET counter = 0;  
  8.     WHILE counter != 10 DO  
  9.         SET counter = counter+1;  
  10.     END WHILE;  
  11. END$$  
  12.   
  13. DELIMITER ;  
DELIMITER $$

DROP PROCEDURE IF EXISTS simple_while$$

CREATE PROCEDURE simple_while(OUT counter INT)
BEGIN
    SET counter = 0;
    WHILE counter != 10 DO
        SET counter = counter+1;
    END WHILE;
END$$

DELIMITER ;

REPEAT、 UNTILL
Java代码 复制代码
  1. DELIMITER $$  
  2.   
  3. DROP PROCEDURE IF EXISTS simple_repeat$$  
  4.   
  5. CREATE PROCEDURE simple_repeat(OUT counter INT)  
  6. BEGIN  
  7.     SET counter = 0;  
  8.     REPEAT  
  9.         SET counter = counter+1;  
  10.     UNTIL counter = 10 END REPEAT;  
  11. END$$  
  12.   
  13. DELIMITER ;  
DELIMITER $$

DROP PROCEDURE IF EXISTS simple_repeat$$

CREATE PROCEDURE simple_repeat(OUT counter INT)
BEGIN
    SET counter = 0;
    REPEAT
        SET counter = counter+1;
    UNTIL counter = 10 END REPEAT;
END$$

DELIMITER ;


7,异常处理
如果用cursor获取SELECT语句返回的所有结果集时应该定义NOT FOUND error handler来防止存储程序提前终结
如果SQL语句可能返回constraint violation等错误时应该创建一个handler来防止程序终结

8,数据库交互
INTO用于存储单行记录的查询结果
Java代码 复制代码
  1. DECLARE total_sales NUMERIC(8, 2);  
  2. SELECT SUM(sale_value) INTO total_sales FROM sales WHERE customer_id=in_customer_id;  
DECLARE total_sales NUMERIC(8, 2);
SELECT SUM(sale_value) INTO total_sales FROM sales WHERE customer_id=in_customer_id;


CURSOR用于处理多行记录的查询结果
Java代码 复制代码
  1. DELIMITER $$  
  2.   
  3. DROP PROCEDURE IF EXITS cursor_example$$  
  4. CREATE PROCEDURE cursor_example()  
  5.     READS SQL DATA  
  6. BEGIN  
  7.     DECLARE l_employee_id INT;  
  8.     DECLARE l_salary NUMERIC(8,2);  
  9.     DECLARE l_department_id INT;  
  10.     DECLARE done INT DEFAULT 0;  
  11.     DECLARE cur1 CURSOR FOR SELECT employee_id, salary, department_id FROM employees;  
  12.     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;  
  13.   
  14.     OPEN cur1;  
  15.     emp_loop: LOOP  
  16.         FETCH cur1 INTO l_employee_id, l_salary, l_department_id;  
  17.         IF done=1 THEN  
  18.             LEAVE emp_loop;  
  19.         END IF;  
  20.     END LOOP emp_loop;  
  21.     CLOSE cur1;  
  22. END$$  
  23. DELIMITER ;  
DELIMITER $$

DROP PROCEDURE IF EXITS cursor_example$$
CREATE PROCEDURE cursor_example()
    READS SQL DATA
BEGIN
    DECLARE l_employee_id INT;
    DECLARE l_salary NUMERIC(8,2);
    DECLARE l_department_id INT;
    DECLARE done INT DEFAULT 0;
    DECLARE cur1 CURSOR FOR SELECT employee_id, salary, department_id FROM employees;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;

    OPEN cur1;
    emp_loop: LOOP
        FETCH cur1 INTO l_employee_id, l_salary, l_department_id;
        IF done=1 THEN
            LEAVE emp_loop;
        END IF;
    END LOOP emp_loop;
    CLOSE cur1;
END$$
DELIMITER ;


unbounded SELECT语句用于存储过程返回结果集
Java代码 复制代码
  1. DELIMITER $$  
  2. DROP PROCEDURE IF EXISTS sp_emps_in_dept$$  
  3. CREATE PROCEDURE sp_emps_in_dept(in_employee_id INT)  
  4. BEGIN  
  5.     SELECT employee_id, surname, firstname, address1, address2, zipcode, date_of_birth FROM employees WHERE department_id=in_employee_id;  
  6. END$$  
  7.   
  8. DELIMITER ;  
DELIMITER $$
DROP PROCEDURE IF EXISTS sp_emps_in_dept$$
CREATE PROCEDURE sp_emps_in_dept(in_employee_id INT)
BEGIN
    SELECT employee_id, surname, firstname, address1, address2, zipcode, date_of_birth FROM employees WHERE department_id=in_employee_id;
END$$

DELIMITER ;


UPDATE、INSERT、DELETE、CREATE TABLE等 非查询语句也可以嵌入存储过程里
Java代码 复制代码
  1. DELIMITER $$  
  2.   
  3. DROP PROCEDURE IF EXITS sp_update_salary$$  
  4. CREATE PROCEDURE sp_update_salary(in_employee_id INT, in_new_salary NUMERIC(8,2))  
  5. BEGIN  
  6.     IF in_new_salary < 5000 OR in_new_salary > 500000 THEN  
  7.         SELECT "Illegal salary: salary must be between $5000 and $500, 000";  
  8.     ELSE  
  9.         UPDATE employees SET salary=in_new_salary WHERE employee_id=in_employee_id;  
  10.     END IF:  
  11. END$$  
  12.   
  13. DELIMITER ;  
DELIMITER $$

DROP PROCEDURE IF EXITS sp_update_salary$$
CREATE PROCEDURE sp_update_salary(in_employee_id INT, in_new_salary NUMERIC(8,2))
BEGIN
    IF in_new_salary < 5000 OR in_new_salary > 500000 THEN
        SELECT "Illegal salary: salary must be between $5000 and $500, 000";
    ELSE
        UPDATE employees SET salary=in_new_salary WHERE employee_id=in_employee_id;
    END IF:
END$$

DELIMITER ;


9,使用 CALL调用存储程序
Java代码 复制代码
  1. DELIMITER $$  
  2.   
  3. DROP PROCEDURE IF EXISTS call_example$$  
  4. CREATE PROCEDURE call_example(employee_id INT, employee_type VARCHAR(20))  
  5.     NO SQL  
  6. BEGIN  
  7.     DECLARE l_bonus_amount NUMERIC(8,2);  
  8.   
  9.     IF employee_type='MANAGER' THEN  
  10.         CALL calc_manager_bonus(employee_id, l_bonus_amount);  
  11.     ELSE  
  12.         CALL calc_minion_bonus(employee_id, l_bonus_amount);  
  13.     END IF;  
  14.     CALL grant_bonus(employee_id, l_bonus_amount);  
  15. END$$  
  16. DELIMITER ;  
DELIMITER $$

DROP PROCEDURE IF EXISTS call_example$$
CREATE PROCEDURE call_example(employee_id INT, employee_type VARCHAR(20))
    NO SQL
BEGIN
    DECLARE l_bonus_amount NUMERIC(8,2);

    IF employee_type='MANAGER' THEN
        CALL calc_manager_bonus(employee_id, l_bonus_amount);
    ELSE
        CALL calc_minion_bonus(employee_id, l_bonus_amount);
    END IF;
    CALL grant_bonus(employee_id, l_bonus_amount);
END$$
DELIMITER ;


10,一个复杂的例子
Java代码 复制代码
  1. CREATE PROCEDURE putting_it_all_together(in_department_id INT)  
  2.     MODIFIES SQL DATA  
  3. BEGIN  
  4.     DECLARE l_employee_id INT;  
  5.     DECLARE l_salary NUMERIC(8,2);  
  6.     DECLARE l_department_id INT;  
  7.     DECLARE l_new_salary NUMERIC(8,2);  
  8.     DECLARE done INT DEFAULT 0;  
  9.   
  10.     DECLARE cur1 CURSOR FOR  
  11.         SELECT employee_id, salary, department_id  
  12.         FROM employees  
  13.         WHERE department_id=in_department_id;  
  14.   
  15.     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;  
  16.   
  17.     CREATE TEMPORARY TABLE IF NOT EXISTS emp_raises  
  18.         (employee_id INT, department_id INT, new_salary NUMERIC(8,2));  
  19.   
  20.     OPEN cur1;  
  21.     emp_loop: LOOP  
  22.         FETCH cur1 INTO l_employee_id, l_salary, l_department_id;  
  23.         IF done=1 THEN    /* No more rows */  
  24.             LEAVE emp_loop;  
  25.         END IF;  
  26.         CALL new_salary(1_employee_id, l_new_salary); /* Get new salary */  
  27.         IF (l_new_salary <> l_salary) THEN  /* Salary changed */  
  28.             UPDATE employees  
  29.                 SET salary=l_new_salary  
  30.             WHERE employee_id=l_employee_id;  
  31.             /* Keep track of changed salaries */  
  32.             INSERT INTO emp_raises(employee_id, department_id, new_salary)  
  33.                 VALUES (l_employee_id, l_department_id, l_new_salary);  
  34.         END IF:  
  35.     END LOOP emp_loop;  
  36.     CLOSE cur1;  
  37.     /* Print out the changed salaries */  
  38.     SELECT employee_id, department_id, new_salary from emp_raises  
  39.         ORDER BY employee_id;  
  40. END;  
CREATE PROCEDURE putting_it_all_together(in_department_id INT)
    MODIFIES SQL DATA
BEGIN
    DECLARE l_employee_id INT;
    DECLARE l_salary NUMERIC(8,2);
    DECLARE l_department_id INT;
    DECLARE l_new_salary NUMERIC(8,2);
    DECLARE done INT DEFAULT 0;

    DECLARE cur1 CURSOR FOR
        SELECT employee_id, salary, department_id
        FROM employees
        WHERE department_id=in_department_id;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;

    CREATE TEMPORARY TABLE IF NOT EXISTS emp_raises
        (employee_id INT, department_id INT, new_salary NUMERIC(8,2));

    OPEN cur1;
    emp_loop: LOOP
        FETCH cur1 INTO l_employee_id, l_salary, l_department_id;
        IF done=1 THEN    /* No more rows */
            LEAVE emp_loop;
        END IF;
        CALL new_salary(1_employee_id, l_new_salary); /* Get new salary */
        IF (l_new_salary <> l_salary) THEN  /* Salary changed */
            UPDATE employees
                SET salary=l_new_salary
            WHERE employee_id=l_employee_id;
            /* Keep track of changed salaries */
            INSERT INTO emp_raises(employee_id, department_id, new_salary)
                VALUES (l_employee_id, l_department_id, l_new_salary);
        END IF:
    END LOOP emp_loop;
    CLOSE cur1;
    /* Print out the changed salaries */
    SELECT employee_id, department_id, new_salary from emp_raises
        ORDER BY employee_id;
END;


11,存储方法
存储方法与存储过程的区别
1,存储方法的参数列表只允许IN类型的参数,而且没必要也不允许指定IN关键字
2,存储方法返回一个单一的值,值的类型在存储方法的头部定义
3,存储方法可以在SQL语句内部调用
4,存储方法不能返回结果集
语法:
Java代码 复制代码
  1. CREATE  
  2.     [DEFINER = { user | CURRENT_USER }]  
  3.     PROCEDURE sp_name ([proc_parameter[,...]])  
  4.     [characteristic ...] routine_body  
  5.   
  6. CREATE  
  7.     [DEFINER = { user | CURRENT_USER }]  
  8.     FUNCTION sp_name ([func_parameter[,...]])  
  9.     RETURNS type  
  10.     [characteristic ...] routine_body  
  11.       
  12. proc_parameter:  
  13.     [ IN | OUT | INOUT ] param_name type  
  14.       
  15. func_parameter:  
  16.     param_name type  
  17.   
  18. type:  
  19.     Any valid MySQL data type  
  20.   
  21. characteristic:  
  22.     LANGUAGE SQL  
  23.   | [NOT] DETERMINISTIC  
  24.   | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }  
  25.   | SQL SECURITY { DEFINER | INVOKER }  
  26.   | COMMENT 'string'  
  27.   
  28. routine_body:  
  29.     Valid SQL procedure statement  
CREATE
    [DEFINER = { user | CURRENT_USER }]
    PROCEDURE sp_name ([proc_parameter[,...]])
    [characteristic ...] routine_body

CREATE
    [DEFINER = { user | CURRENT_USER }]
    FUNCTION sp_name ([func_parameter[,...]])
    RETURNS type
    [characteristic ...] routine_body
    
proc_parameter:
    [ IN | OUT | INOUT ] param_name type
    
func_parameter:
    param_name type

type:
    Any valid MySQL data type

characteristic:
    LANGUAGE SQL
  | [NOT] DETERMINISTIC
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }
  | COMMENT 'string'

routine_body:
    Valid SQL procedure statement

各参数说明见 CREATE PROCEDURE and CREATE FUNCTION Syntax
例子:
Java代码 复制代码
  1. DELIMITER $$  
  2.   
  3. DROP FUNCTION IF EXISTS f_discount_price$$  
  4. CREATE FUNCTION f_discount_price  
  5.     (normal_price NUMERIC(8,2))  
  6.     RETURNS NUMERIC(8,2)  
  7.     DETERMINISTIC  
  8. BEGIN  
  9.     DECLARE discount_price NUMERIC(8,2);  
  10.   
  11.     IF (normal_price > 500) THEN  
  12.         SET discount_price = normal_price * .8;  
  13.     ELSEIF (normal_price >100) THEN  
  14.         SET discount_price = normal_price * .9;  
  15.     ELSE  
  16.         SET discount_price = normal_price;  
  17.     END IF;  
  18.   
  19.     RETURN(discount_price);  
  20. END$$  
  21.   
  22. DELIMITER ;  
DELIMITER $$

DROP FUNCTION IF EXISTS f_discount_price$$
CREATE FUNCTION f_discount_price
    (normal_price NUMERIC(8,2))
    RETURNS NUMERIC(8,2)
    DETERMINISTIC
BEGIN
    DECLARE discount_price NUMERIC(8,2);

    IF (normal_price > 500) THEN
        SET discount_price = normal_price * .8;
    ELSEIF (normal_price >100) THEN
        SET discount_price = normal_price * .9;
    ELSE
        SET discount_price = normal_price;
    END IF;

    RETURN(discount_price);
END$$

DELIMITER ;


12,触发器
触发器在INSERT、UPDATE或DELETE等DML语句修改数据库表时触发
触发器的典型应用场景是重要的业务逻辑、提高性能、监控表的修改等
触发器可以在DML语句执行前或后触发
Java代码 复制代码
  1. DELIMITER $$  
  2.   
  3. DROP TRIGGER sales_trigger$$  
  4. CREATE TRIGGER sales_trigger  
  5.     BEFORE INSERT ON sales  
  6.     FOR EACH ROW  
  7. BEGIN  
  8.     IF NEW.sale_value > 500 THEN  
  9.         SET NEW.free_shipping = 'Y';  
  10.     ELSE  
  11.         SET NEW.free_shipping = 'N';  
  12.     END IF;  
  13.   
  14.     IF NEW.sale_value > 1000 THEN  
  15.         SET NEW.discount = NEW.sale_value * .15;  
  16.     ELSE  
  17.         SET NEW.discount = 0;  
  18.     END IF;  
  19. END$$  
  20.   
  21. DELIMITER ; 
用友YonSuite产品实操手把手教学(图文版) 用友YonSuite 阅读详情

相关推荐

鼎捷T100二次开发实战:如何给开窗功能加上权限锁(附完整代码)

本文详细解析了鼎捷T100二次开发中开窗功能权限锁的实现方法,提供了两种技术方案:开窗程序重构法和动态WHERE条件注入法,并附上完整代码示例。通过真实案例,帮助开发者解决数据权限细粒度控制的难题,提升ERP系统的安全性和实用性。

weixin_28454475的博客 443

MYSQL存储程序入门指南

https://www.cnblogs.com/wxb-km/archive/2012/11/18/2775780.html 1,前提 :需要MySQL 5 2,一个最简单的Hello world 程序 CREATE PROCEDURE HelloWorld() BEGIN SELECT "Hello World!"; END; 3,变量 使用DECLARE来声明,DEFA...

博客 319

光模块封装工艺简介

光模块按照部件可以分为芯片、光器件、光模块三个层级;按照应用领域大概可分为电信应用、数通应用两个领域;按照内部器件的封装工艺可分为TO、Box、COB三大类。 但是,无论是哪种类型的光模块,其生产工艺基本上可以分为封装、测试两大块。   那什么叫做器件封装呢?我的理解器件封装就是利用胶水、焊料、机械、热量等手段把器件按照一定的先后次序结合形成一个整体的过程,就好像早上吃的煎饼,把面粉、鸡蛋、脆饼、烤肠、葱花等这些“器件”,按照一定的顺序,通过食用油、甜面酱、加热、卷起来等手段结合到一起,形成了美味的

qq_33253182的博客 2832

mysql程序入门_MySQL存储程序入门指南

1,前提 :需要MySQL 52,一个最简单的Hello world 程序CREATE PROCEDURE HelloWorld()BEGINSELECT "Hello World!";END;3,变量使用DECLARE来声明,DEFAULT赋默认值,SET赋值DECLARE counter INT DEFAULT 0;SET counter = counter+1;4,参数IN为默认类型,值必须...

weixin_28878185的博客 94

STM32与威纶通触摸屏RS485通信实战:Modbus RTU协议与避坑指南

在工业自动化与嵌入式系统开发中,串行通信是实现设备间数据交换的基础技术。RS485总线凭借其差分信号传输、抗干扰能力强、支持多点通信及长距离传输等特性,成为工业现场广泛应用的物理层标准。其核心原理是利用一对双绞线进行平衡传输,有效抑制共模噪声。在协议层,Modbus RTU作为开放、简洁的主从式应用层协议,定义了统一的数据模型(如线圈、寄存器)和功能码,极大简化了不同厂商设备间的互操作性。结合STM32微控制器的UART外设与威纶通(Weinview)人机界面(HMI),可以构建稳定可靠的监控与控制系统。本

weixin_33925615的博客 334

【txt文本加密】使用 cryptography 库实现加密和解密

cryptography 库是一个强大的 Python 库,用于实现加密和解密功能。它提供了各种加密算法,包括对称加密、非对称加密、哈希函数等。

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 2668

MySQL存储程序

1.什么是MySQL存储程序? 存放在MySQL服务器端,供重复使用的对象叫做存储程序。存储程序分为以下四种: (1)存储过程:不直接返回一个计算结果,但可以用来完成一般的运算或是生成一个结果集并传递回客户端。 一条SQL语句如果比作一行java代码,存储过程就相当于一个java方法,可以包含许多SQL语句,进行更复杂的操作。 (2)存储函数:返回一个计算结果,该结果可以用在表达式里。 ...

月下泛舟的博客 2067

浏览器缓存导致代码不更新?一招解决部署后用户仍看到旧页面的问题

方案效果适用场景文件名哈希永久解决前端工程化项目HTTP缓存头控制精准控制需服务器权限Meta标签部分生效临时补救方案最佳实践:入口HTML禁用缓存,静态资源使用哈希文件名 + 长期缓存,达到「秒级更新」+「高性能」的平衡!

江拥羡橙的博客 810

《MySQL技术》学习笔记——视图和存储程序

MySQL技术内幕——视图和存储程序视图和存储程序使用视图使用存储程序复合语句和语句分隔符存储函数和存储过程触发器事件视图和存储程序的安全性 视图和存储程序 存储程序 是存储函数,存储过程,触发器和事件的总称。 存储例程 特指存储函数,存储过程。 使用视图 视图是一个虚表,它是在表或其他视图的基础上,使用 SELECT 语句来定义的。 查询视图就等效于查询定义它的那条语句,只是视图将细节隐藏了起来。 视图定义里可以包含表达式计算和连接等操作,因此查询视图更易于编写出简单的用于获得所要信息的查询。 一个基

weixin_45243288的博客 902

UE5 推荐的资产命名规范

在开发阶段中,随着 虚幻引擎(UE)(Unreal Engine (UE)) 项目日益复杂,内容浏览器(Content Browser) 中的 资产(Assets) 列表会不断扩充。这会导致资产出现各种变体版本,也会导致资产名称因过于相似而造成混淆。比如,你有一个文件夹名为"Soldier",这个文件夹中有蓝图、纹理和模型,它们的名称中都带"Soldier"一词,但在简单列表中,很难区别它们。

一碗清深的博客 3375

2025实战|C#上位机+STM32实现LED串灯控制:串口通信+PWM调光+自定义帧协议(附上下位机源码)

粘包:一次收到“BRIGHT:50LED_OFF”,解析完全错乱;乱码:串口波特率/编码不匹配,指令变成“??H??50”;丢帧:数据传输中少字符,比如“BRIGHT:5”,解析出亮度5而非50。因此我们设计字节级自定义帧协议协议先行:无论简单还是复杂场景,先定义清晰的帧协议,避免数据错乱;串口稳字当头:下位机用环形缓冲区接收,上位机加锁发送,避免丢包/粘包;跨线程必处理:C#上位机所有UI更新必须用Invoke,否则必崩溃;硬件是基础:接线、供电、共地这些细节,比代码更易出问题;

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 756

MySQL 存储程序

mysql 存储程序 ①什么是存储程序 存储程序原理: 将程序像数据一样存储到计算机内部存储器中的一种设计原理 解释: 存储程序是一种批处理的形式, 本质上封装了一些可执行的SQL语句和一些特殊的控制结构, 然后给用户提供一种简单的调用方式来执行这些语句 ②存储程序分类 存放在MySQL服务器端,供重复调用的对象叫做存储程序, 分为以下四种: 存储过程 封装很多 SQL 语句完成某种特...

日格一物 258

YOLOv11【第六章:模型压缩与极致优化篇·第15节】YOLOv11 专用剪枝工具库使用指南!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 1312

Mysql 存储程序

存储程序包括:存储函数,存储过程,触发器,事件 存储程序可以使用局部变量,条件语句,循环和嵌套语句块等多种语法构造,符合语句使用begin开头,end结尾 符合语句块里的语句必须以分号(;)彼此隔开,由于mysql程序默认使用(";")来充当语句分隔符,所以需要使用delimiter $ 暂时将分隔符 设置成$符,等结束后再修改回来,例如: delimiter $  create pro

daiyuntao841226的专栏 563

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

MYSQL笔记(存储程序)

<br /><br /> <br />存储程序即将SQL语句存储在服务器上,客户端无需重新发布单独语句。<br />遵循的语法:SQL2003<br />前提:需要在MYSQL数据库中有proc表,该表在安装MYSQL过程中创建<br />权限:<br />1.创建存储子程序:CREATE ROUTINE权限<br />2.提醒或移除子程序:ALTER ROUTINE权限<br />3.执行子程序:EXECUTE权限<br />一个子程序与特定的数据库相联系,在存储子程序内USE语句是不允许的。<br />

记录成长之路 635

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

mysql存储程序,存储函数

存储引擎 ​ Mysql的核心就是存储引擎,DBMS(数据库管理系统)借助于引擎实现增删改查操作。可以根据不同的功能来设置不同的存储引擎。 ​ InnoDB是事务型数据库的首选,执行安全性数据库,行锁定和外键。mysql5.5之后默认使用。 ​ MyISAM插入速度和查询效率较高,但不支持事务。 ​ MEMORY将表中的数据存储在内存中,速度较快。 事务 一系列的DML操作,要么同时成功,...

weixin_44142672的博客 269

mysql存储程序相关用法总结

mysql存储程序相关用法 存储函数 存储函数将向调用者返回结果 存储函数创建实例 mysql> delimiter $    //设置$为分隔符 mysql> create function get_carname(car_id int)   //创建函数 参数为car_id     -> returns varc

code4grow专栏 3571

MySQL 存储程序之存储过程

一.存储引擎 1.存储引擎简介 是MySQL的核心,一组软件包括缓存软件,语法语义分析,解析的软件等,不同的存储引擎提供不同的存储机制,索引技巧,锁定水平等功能。可以根据不同的功能来设置不同的存储引擎。 InnoDB:事务性数据库的首选,执行安全性数据库,行锁定和外键。 显示支持的存储引擎:show engines; 修改默认存储引擎:my.ini -&gt; default -s...

猫君之上的博客 271

存储程序

存储程序

stay_awake__的博客 583

MySQL基础(八)-----视图和存储程序

视图是一种虚拟表;视图就是帮助我们以很容易的方式来复用一些sql语句; 存储程序分为存储例程、触发器和事件这几种类型。其中存储例程又可以被细分为存储函数和存储过程。

leen的博客 1777

mysql使用--存储程序

存储函数,存储过程,游标,触发器,事件

x13262608581的博客 1445

MySQL语法拾遗-存储程序

title: mysql语法拾遗-存储程序 date: 2019-11-11 12:23:49 categories: MySQL MySQL语法相关 tags: MySQL 语法指南 description: MySQL中的存储程序介绍(存储例程,触发器,事件) MySQL中的存储程序 自定义变量与语句结束符 自定义变量 set 使用set语句,自定义变量,变量名前要加’@'符号。可以将...

youyike的博客 194

mysql储存程序包括_MySQL学习笔记——存储程序(一)

一、存储程序分为以下几种:①存储函数(stored function)。返回一个计算结果,该结果可以用在表达式里。②存储过程(stored procedure)。不直接返回一个结果,但可以用来完成一般的运算或是生成一个结果集并传递回客户。③触发器(trigger)。与数据表相关联,当那个数据表被INSERT、DELETE、UPDATE语句修改时,触发器将自动执行。④事件(event)。根据时间表在...

weixin_40008135的博客 1136

【MySQL】8.0:存储程序

8.1 存储程序 存储程序: 预先在数据库服务器端存储SQL命令/语句,并且过后能在数据库服务器端被执行的数据库对象。 存储程序的主体: 存储程序定义的主体除了常规的SQL语句外,通常还使用变量声明、选择、循环和复合语句等。 使用存储程序: 利用CALL语句等方式使用存储程序。 存储程序的分类: 存储例程:和一个数据库相关,可以根据名字调用 触发器:和一个表相关,并在该表产生特殊事件时被触发 事件:和一个数据库相关,代表了由MySQL服务器的事件调度器在特定时刻调度执行的任务 8.1.1 存储例程 存储例程

Heart_for_Ling的博客 1529

MySQL入门系列:存储程序(一)之自定义变量简介

存储程序 有时候为了完成一个常用的功能需要执行许多条语句,每次都在客户端里一条一条的去输入这么多语句是很烦的,我们希望有一种批处理的形式,让我们以很简单的方式一次性的执行完这些语句,MySQL中的存储程序本质上封装了一些可执行的语句,然后给用户提供一种简单的调用方式来执行这些语句,根据调用方式的不同,我们可以把存储程序分为存储例程、触发器和事件这几种类型。其中,存储例程又可以被细分为存储函数和存储...

weixin_34055910的博客 163
上一篇: .NET配置文件解析过程详解
下一篇: 河北省网上报税系统使用心得
Steven_god
博客等级 码龄22年 6粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值