当前位置: 首页 > news >正文

mysql使用--存储程序

1.概述
存储程序可以封装一些语句,为用户提供一种简单的方式来调用这个存储程序,从而间接执行其封装的语句。
根据调用方式的不同,可把存储程序分为存储例程、触发器、事件几种类型。其中,存储例程又可被细分为存储函数和存储过程。

2.用户自定义变量
MYSQL中,可通过SET语句来自定义一些自己的变量。
如:SET @a = 1;
在我们的自定义变量前面必须加一个@符号。
在使用SET语句时,如变量名前没有加@符号,则MYSQL会把这个变量当作系统变量来对待。
之后想查看这个变量的值,使用SELECT @变量名;
如:SELECT @a;
同一个变量也可存储不同类型的值。如,再把一个字符串赋给变量a。
如:SET @a = ‘哈哈哈’;
除了把一个常量赋给一个变量,也可把一个变量赋给另一个变量。
如:SET @b = @a;
变量a,b是独立的。此后a改变不会影响b。

当某个查询的结果集是一行一列时,可将查询结果集赋给变量。
如:SET @a = (SELECT m1 FROM t1 LIMIT 1);
也可用INTO子句完成类似功能。
如:SELECT n1 FROM t1 LIMIT 1 INTO @b;效果等价于SET @b = (SELECT n1 FROM t1 LIMIT 1);

当某个查询的结果集是一行多列。如想将结果集中各列赋值给不同的变量,不能用SET,只能用INTO。
如:SELECT m1, n1 FROM t1 LIMIT 1 INTO @a, @b;

3.存储函数
存储程序可以分为存储例程,触发器,事件几种类型。
存储例程需我们去手动调用,触发器和事件都是MySQL服务器在特定条件下自己调用的。
存储例程又可分为存储函数,存储过程。

3.1.创建存储函数
存储函数是一种函数,在函数定义中书写MySQL语句。

在MySQL中定义存储函数的语句如下:

CREATE FUNCTION 存储函数名称([参数列表])
RETURNS 返回值类型
BEGIN函数体内容
END

定义一个存储函数时,需指定存储函数名称,参数列表,返回值类型及函数体内容。
如该函数不需参数,则参数列表可省略。
函数体内容被包裹在BEGIN … END中,可包括一条或多条语句,每条语句都要以分号(;)结尾。
上述语句中空格,换行也可略去。不会影响含义。

实例:

CREATE FUNCTION avg_score(s VARCHAR(100))
RETURNS DOUBLE
BEGINRETURN (SELECT AVG(score) FROM student_score WHERE subject = s);
END

由于MySQL默认将;视为语句结束符。
所以,执行上述函数定义应该这样写:

DELIMITER $
CREATE FUNCTION avg_score(s VARCHAR(100))
RETURNS DOUBLE
BEGINRETURN (SELECT AVG(score) FROM student_score WHERE subject = s);
END $DELIMITER ;

上述通过DELIMITER将MySQL的语句结束符临时修改为$,之后再修改回来。

有时,要创建函数,可能得设置下:SET global log_bin_trust_function_creators = TRUE;

3.2.存储函数的调用
函数调用可单独使用,也可作为一个操作数与其他操作数组成复杂的表达式。
如:SELECT avg_score(‘MySQL是怎样运行的’);

3.3.查看和删除存储函数
如:SHOW FUNCTION STATUS [LIKE 需要匹配的函数名];

查看函数定义,如:SHOW CREATE FUNCTION 函数名\G
删除存储函数,如:DROP FUNCTION 函数名;

3.4.函数体的定义
3.4.1.在函数体中定义局部变量
如果我们想在存储函数的函数体中使用变量的话,必须提前使用DECLARE语句声明该变量。具体语法:
DECLARE 变量名1, 变量名2, … 数据类型 [DEFAULT 默认值];
这些在函数体内声明的变量只在该函数体内有用,当存储函数执行完成后,就不能访问这些变量了。所以,这些变量也称为局部变量。

可在一条语句中声明多个相同类型的变量。
注意的是,函数体中的局部变量不允许加@前缀(除非使用反引号将变量名引起来),这一点与之前直接使用SET语句自定义变量截然不同。在声明了这个局部变量后,在可使用它。

DELIMITER $
CREATE FUNCTION var_demo()
RETURNS INT
BEGINDECLARE c INT;SET c=5;RETURN c;
END $

如果不对声明的局部变量进行赋值,它的默认值就是NULL,当然也可通过DEFAULT子句来显式地指定局部变量的默认值,比如:

DELIMITER $
CREATE FUNCTION var_default_demo()
RETURNS INT
BEGINDECLARE c INT DEFAULT 1;RETURN c;
END $
DELIMITER ;

与用户自定义变量类似,也可把一个查询的结果赋给局部变量。

DELIMITER $
CREATE FUNCTION var_default_demo()
RETURNS DOUBLE
BEGINDECLARE c DOUBLE DEFAULT 1.0;SET c =  (SELECT AVG(score) FROM student_score WHERE subject = s);return c;
END $
DELIMITER ;

3.4.2.在函数体中使用用户自定义变量

DELIMITER $
CREATE FUNCTION user_defined_var_demo()
RETURNS INT
BEGINSET @abc = 10;RETURN @abc;
END $
DELIMITER ;

3.4.3.存储函数的参数
在定义存储函数的时候,可以指定多个参数,且每个参数都要指定对应的数据类型。
形参名不应与函数体语句中的其他变量中,列名冲突。形参不支持提供默认值。
形参,函数体内定义的参数均为局部变量。局部变量使用时候必须加@前缀。全局变量使用时必须加@前缀。
函数体内需要定义局部变量时,局部变量定义必须出现在函数体内语句的最前方。
函数体内对形参的修改不会传递到外部实参。

3.4.4.判断语句的编写
在存储函数的函数体中可使用判断语句。

IF 表达式 THEN语句列表
[ELSEIF 表达式 THEN 语句列表]
...
[ELSE 语句列表]
END IF;

如:

DELIMITER $
CREATE FUNCTION condition_demo(i INT)
RETURNS VARCHAR(10)
BEGIN
DECLARE result VARCHAR(10);
IF i = 1 THENSET result = '结果是1';
ELSEIF i = 2 THENSET result='结果是2';
ELSEIF i = 3 THENSET result='结果是3';
ELSESET result='非法参数';
END IF;
RETURN result;
END $DELIMITER ;

3.4.5.循环语句的编写
(1).WHILE循环语句
WHILE 表达式 DO
语句列表
END WHILE;

DELIMITER $
CREATE FUNCTION sum_all(n INT UNSIGNED)
RETURNS INT
BEGINDECLARE result INT DEFAULT 0;DECLARE i INT DEFAULT 1;WHILE i <= n DOSET result = result +  i;SET i = i + 1;END WHILE;RETURN result;
END $DELIMITER ;

这样执行SELECT sum_all(3);结果将是6。

(2).REPEAT语句

REPEAT语句列表
UNTIL 表达式 END REPEAT

表达式为真时,跳出循环。

CREATE FUNCTION sum_all(n INT UNSIGNED)
RETURNS INT
BEGINDECLARE result INT DEFAULT 0;DECLARE i INT DEFAULT 1;REPEATSET result = result + i;SET i = i + 1;UNTIL i > n END REPEAT;RETURN result;
END

(3).LOOP循环语句

LOOP 语句列表
END LOOP;

LOOP下要么在语句列表通过RETURN实现返回,要么通过LOOP添加标志与LEAVE的方式离开。

CREATE FUNCTION sum_all(n INT UNSIGNED)
RETURNS INT
BEGINDECLARE result INT DEFAULT 0;DECLARE i INT DEFAULT 1;LOOPIF i > n THENRETURN result;END IF;SET result = result + i;SET i = i + 1;END LOOP;
END

上述为通过RETURN实现返回

CREATE FUNCTION sum_all(n INT UNSIGNED)
RETURNS INT
BEGINDECLARE result INT DEFAULT 0;DECLARE i INT DEFAULT 1;flag:LOOPIF i > n THENLEAVE flag;END IF;SET result = result + i;SET i = i + 1;END LOOP flag;RETURN result;
END

4.存储过程
存储函数和存储过程都属于存储例程,都是对某些语句的一个封装。存储函数会给调用它的用户返回一个结果,但存储过程没返回值。

4.1.创建存储过程

CREATE PROCEDURE 存储过程名称([参数列表])
BEGIN需要执行的语句
END

存储过程不需声明返回值类型,也无法返回值。

DELIMITER $
CREATE PROCEDURE t1_operation(m1_value INT, n1_value CHAR(1))
BEGINSELECT * FROM t1;INSERT INTO t1(m1, n1) VALUES(m1_value, n1_value);SELECT * FROM t1;
END $

4.2.存储过程的调用
如果我们需调用某个存储过程,需显式使用CALL:CALL 存储过程([参数列表]);
针对上述过程这样调用:CALL t1_operation(4, 'd');

4.3.查看和删除存储过程
查看:SHOW PROCEDURE STATUS [LIKE 需要匹配的存储过程名称];
查看存储过程定义:SHOW CREATE PROCEDURE 存储过程名称;
删除存储过程:DROP PROCEDURE 存储过程名称;

4.4.存储过程中的语句
存储函数中使用的各种语句,都可用在存储过程中。

4.5.存储过程的参数前缀
比存储函数强大点的是,存储过程在定义参数的时候可选择添加一些前缀:[IN | OUT | INOUT] 参数名 数据类型
IN参考高级语言值传参,OUT参考高级语言引用传参。
(1).IN

DELIMITER $
CREATE PROCEDURE p_in(IN arg INT)
BEGINSELECT arg;SET arg = 123;
END $
DELIMITER ;

上述采用IN修饰形参

SET @a = 1;
CALL p_in(@a);
SELECT @a; // 这里a仍然为1

对IN修饰的形参,可以传递常量实参。

(2).OUT

DELIMITER $
CREATE PROCEDURE p_out(OUT arg INT)
BEGINSELECT arg;SET arg = 123;
END $
DELIMITER ;

上述采用OUT修饰形参

SET @b = 2;
CALL p_out(@b);// 这里内部执行SELECT输出值将是NULL,因为OUT修饰的形参不可用于读取值。只能被设置值。
SELECT @b; // 这里b变为123

对OUT修饰的形参,不可以传递常量实参。

(3).INOUT
INOUT修饰的变量,即可在过程内部被读取,又可被设置值且值会影响到外部实参。
如果不写明参数前缀,默认前缀是IN。

4.5.存储函数与存储过程异同
(1).存储函数定义时需通过RETURNS指定返回类型,函数体中需用RETURN指定返回值;存储过程不需要。
(2).存储函数形参不支持IN,OUT,INOUT修饰;存储过程支持。
(3).存储函数只可返回一个值;存储过程可通过OUT或INOUT返回零个或多个。
(4).存储函数不允许在函数内执行单独的select(select xxx into xxx;这样利用select作为中间结果的允许);存储过程执行过程允许支持单独的select且产生的结果集会显示在客户端。
(5).存储函数以函数调用形式调用;存储过程使用CALL形式。

5.游标
前面SELECT ... INTO ...将SELECT子句执行得到结果集中一行作为数据源赋值给INTO子句中变量时,要求SELECT子句结果集只能有一行。
为了在结果集存在多行下,访问其内容引入游标。
游标用来标记结果集中我们正访问的某一条记录。
初始下,标记结果集中的第一条记录。可以取出游标对应记录的信息。移动它,使其指向下条记录。
游标可用于存储函数,存储过程。

5.1.创建游标
如:DECLARE 游标名称 CURSOR FOR 查询语句;这样

CREATE PROCEDURE cursor_demo()
BEGINDECLARE t1_record_cursor CURSOR FOR SELECT m1, n1 FROM t1;// 如存在局部变量声明,局部变量声明放最前面
END

5.2.打开和关闭游标
如:OPEN 游标名称;
如:CLOSE 游标名称;

5.3.通过游标获取记录
使用游标获取结果集中记录:FETCH 游标名 INTO 变量1, 变量2, … 变量n;

CREATE PROCEDURE cursor_demo()
BEGINDECLARE m_value INT;DECLARE n_value CHAR(1);DECLARE t1_record_cursor CURSOR FOR SELECT m1, n1 FROM t1;OPEN t1_record_cursor;FETCH t1_record_cursor INTO m_value, n_value;SELECT m_value, n_value;CLOSE t1_record_cursor;
END $

上述只能利用光标取出一行记录。

CREATE PROCEDURE cursor_demo()
BEGINDECLARE m_value INT;DECLARE n_value CHAR(1);DECLARE record_count INT;DECLARE i INT DEFAULT 0;DECLARE t1_record_cursor CURSOR FOR SELECT m1, n1 FROM t1;SELECT COUNT(*) FROM t1 INTO record_count;OPEN t1_record_cursor;WHILE i < record_count DOFETCH t1_record_cursor INTO m_value, n_value;SELECT m_value, n_value;SET i = i+1;END WHILE;CLOSE t1_record_cursor;
END

上述将获取并输出表中每一行记录。
FETCH子句一方面将光标当前指向行记录内容赋值给INTO子句中变量,一方面将光标更新到下一位置。

5.4.遍历结束时的执行策略
5.3.中利用COUNT计数方式来遍历所有行。还有另一种可选方式。
当游标当前已经指向尾后位置时执行FETCH会报错。默认下,此时会停止存储函数或存储过程的执行,直接向客户端返回一个错误提示。

但,可以在存储函数或存储过程中事先声明一种针对某种错误的处理方式。这样在存储函数或存储过程执行期间若触发了此类错误,将采用事先声明的错误处理方式去处理。
针对FETCH获取不到记录时清空:DECLARE CONTINUE HANDLER FOR NOT FOUND 处理语句;
处理语句可以是简单的一条语句,也可是由BEGIN ... END包裹的多条语句。

CREATE PROCEDURE cursor_demo()
BEGINDECLARE m_value INT;DECLARE n_value CHAR(1);DECLARE done INT DEFAULT 0;DECLARE t1_record_cursor CURSOR FOR SELECT m1, n1 FROM t1;DECLARE CONTINUE HANDLER FOR NOT FOUNT SET done = 1;OPEN t1_record_cursor;flag:LOOPFETCH t1_record_cursor INTO m_value, n_value;IF done = 1 THENLEAVE flag;END IF;SELECT m_value, n_value, done;END LOOP flag;CLOSE t1_record_cursor;
END

上述过程也可完成SELECT子句结果集所有行的遍历。可以看出FETCH执行出错类似高级语言抛异常,DECLARE CONTINUE HANDLER类似高级语言捕获指定类型异常。异常捕获处理后将继续执行异常语句下条语句。

相关文章:

mysql使用--存储程序

1.概述 存储程序可以封装一些语句&#xff0c;为用户提供一种简单的方式来调用这个存储程序&#xff0c;从而间接执行其封装的语句。 根据调用方式的不同&#xff0c;可把存储程序分为存储例程、触发器、事件几种类型。其中&#xff0c;存储例程又可被细分为存储函数和存储过程…...

Win11修改用户名(超详细图文)

新买的电脑一般预装Windows11系统&#xff08;家庭与学生版&#xff09;&#xff0c;新电脑初次开机使用微软邮箱账号登录&#xff0c;则系统将用户名自动设置成邮箱前5位字符。我的用户名便是一串数字【231xx】&#xff08;qq邮箱前5位&#xff09;&#xff0c;看着很不舒服&a…...

【离散数学】——期末刷题题库(一阶逻辑基本概念)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…...

队列实现方式、效率分析及应用场景

文章目录 一、什么是队列二、队列特性阻塞和非阻塞有界和无界单向链表和双向链表 三、Java队列接口继承图四、Java队列常用方法五、队列实现方式与效率分析六、队列的应用场景七、Python中队列与优先级队列使用 一、什么是队列 队列是一种特殊的线性表&#xff0c;遵循先入先出…...

使用git下载远程所有分支到本地

使用git下载远程所有分支到本地&#xff1a; 打开gitbash 输入以下命令即可&#xff1a; git clone git地址 cd git文件夹 git branch -r | grep -v \-> | while read remote; do git branch --track "${remote#origin/}" "$remote"; done git fetch -…...

解决LocalDateTime传输前端为时间的数组

问题出现如下&#xff1a; 问题出现原因&#xff1a; 默认序列化情况下会使用SerializationFeature.WRITE_DATES_AS_TIMESTAMPS。使用这个解析时就会打印出数组。 解决方法&#xff1a; 我在全文搜索处理方法总结如下&#xff1a; 1.前端自定义函数来书写 ,cols: [[ //表头{…...

01:编译lua及C调用

我们今天在windows平台编译lua&#xff0c;生成 lua动态库,lua.exe&#xff0c;luac.exe 我把这个目录上传到giee&#xff0c;使用下面命令获取它: git clone gitgitee.com:jameschenbo/lua_c_application.git 目录结构如下&#xff1a; build.cmd 是编译脚本&#xff0c;在…...

网络运维与网络安全 学习笔记2023.11.24

网络运维与网络安全 学习笔记 第二十五天 今日目标 DHCP中继代理、三层交换机DHCP、子网划分的原理、子网划分的应用 项目需求分析、技术方案选型、网络拓扑绘制 基础交换网络设计、内网优化、连接外网服务器 DHCP中继代理 DHCP中继概述 场景&#xff1a; DHCP客户端与DH…...

常见树种(贵州省):022绣线菊、月月青、金合欢、胡枝子、白刺花

摘要&#xff1a;本专栏树种介绍图片来源于PPBC中国植物图像库&#xff08;下附网址&#xff09;&#xff0c;本文整理仅做交流学习使用&#xff0c;同时便于查找&#xff0c;如有侵权请联系删除。 图片网址&#xff1a;PPBC中国植物图像库——最大的植物分类图片库 一、绣线菊…...

微星主板开启VT

微星主板模拟器使用 开启VT 进入BIOS高级-》OC-》CPU特征-》intel 虚拟化技术-》允许...

【C++】类型转换 ② ( C++ 静态类型转换 static_cast | C 语言隐式转换弊端 | 代码示例 )

文章目录 一、静态类型转换 static_cast1、C 静态类型转换 static_cast2、C 语言隐式转换弊端3、代码示例 在之前写过一篇 C 类型转换的博客 【C 语言】类型转换 ( 转换操作符 | const_cast | static_cast | dynamic_cast | reinterpret_cast | 字符串转换 ) , 简单介绍了 C 类…...

14.配置Bean有哪几种方式?

配置Bean有哪几种方式? 基于xml: <bean class=“com.tuling.UserService” id=“”>基于注解: @Component(@Controller 、@Service、@Repostory) 前提:需要配置扫描包<component-scan> 反射调用构造方法基于java类配置: @Bean 可以自己控制实例化过程@Import 3种…...

RV1126芯片中的V4L2驱动开发

RV1126芯片概述 RV1126芯片是瑞芯微推出的一款高性能嵌入式人工智能处理器&#xff0c;具有较强的图像处理和音视频处理能力。它采用了双核Cortex-A7架构和一颗DSP核心&#xff0c;支持多种接口和外设&#xff0c;如MIPI CSI、HDMI、USB等&#xff0c;可以广泛应用于物联网、智…...

Linux中部署MongoDB

在 是一个必要的过程&#xff0c;因为MongoDB是一种流行的NoSQL数据库&#xff0c;它可以在大多数操作系统上使用。在本文中&#xff0c;我们将介绍如何在CentOS 8上部署MongoDB。 MongoDB的下载 您可以从MongoDB官网上下载最新的MongoDB版本。使用以下命令下载MongoDB&#…...

Halcon 5分钟学会9点标定 带图片示例、示例源码

9点标定应用流程 前置条件&#xff0c;相机焦距&#xff0c;视野固定高度和角度&#xff0c;光源光强度固定。 移动机械手&#xff0c;使用螺丝批头&#xff0c;在视野范围内的白纸上&#xff0c;点九个点&#xff0c;记录每个点位的位置&#xff0c;每个点位的顺序要和图像上获…...

【非监督学习 | 聚类】聚类算法类别大全 距离度量单位大全

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…...

案例026:基于微信的原创音乐小程序的设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…...

网络运维与网络安全 学习笔记2023.11.26

网络运维与网络安全 学习笔记 第二十七天 今日目标 NAT场景与原理、静态NAT、动态NAT PAT原理与配置、动态PAT之EasyIP、静态PAT之NAT Server NAT场景与原理 项目背景 为节省IP地址和费用&#xff0c;企业内网使用的都是“私有IP地址” Internet网络的组成设备&#xff0c…...

STM32使用多路PWM注意事项

这是使用CubeMX自动产生的代码&#xff0c;使用TIM2产生了PA0,PA1,PA2,PA3这4路PWM&#xff0c;可以看到里面Pulse是共同使用了一个sConfigOC,如果是需要动态调整Pulse&#xff0c;就需要特别注意。 如果是用来产生呼吸灯&#xff0c;就会把这4个PWM都打乱&#xff0c;我觉得&a…...

汽车转向桥设计转向节转向桥机械设计

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;转向桥 获取完整报告说明书工程源文件 转向节图 装配图 本文设计的是JY1061A型采用前置后轮驱动的载货汽车转向桥&#xff0c;因此该转向桥为从动桥。从动桥的功用&#xff1a;从动桥也称非驱动桥&#xff0c;又称从动车轴…...

Applite终极指南:3分钟掌握macOS最优雅的Homebrew图形化管理工具

Applite终极指南&#xff1a;3分钟掌握macOS最优雅的Homebrew图形化管理工具 【免费下载链接】Applite User-friendly GUI macOS application for Homebrew Casks 项目地址: https://gitcode.com/gh_mirrors/ap/Applite 还在为Homebrew的命令行操作而烦恼吗&#xff1f;…...

webflux接收application/x-www-form-urlencoded参数

记录开发中遇到的问题 请求方式&#xff1a;需要用如下方式接收&#xff1a; 方式1PostMapping(value "/user/logout", consumes "application/x-www-form-urlencoded")public ResponseResult logoutForAuthSystem(ServerWebExchange exchange) {exchang…...

Segment方案在VXLAN分布式网关DCI互联中的实践与优化

1. Segment方案与VXLAN分布式网关的黄金组合 第一次接触Segment方案时&#xff0c;我正面临两个数据中心之间二层网络无法互通的棘手问题。传统方案需要在两端数据中心维护完全一致的VXLAN参数&#xff0c;就像要求两个国家使用相同的邮政编码体系&#xff0c;实际操作中几乎不…...

如何永久解决IDM激活弹窗:3种简单高效的终极方案

如何永久解决IDM激活弹窗&#xff1a;3种简单高效的终极方案 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script Internet Download Manager&#xff08;IDM&#xf…...

批量设计元素替换:提升设计师效率的智能工作流解决方案

批量设计元素替换&#xff1a;提升设计师效率的智能工作流解决方案 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 在现代UI设计和品牌视觉开发流程中&#xff0c;设计师经常面临需…...

OpenClaw 保姆级安装指南:从下载到运行,一次成功避坑全解

2026年爆火的开源数字员工OpenClaw&#xff08;小龙虾&#xff09;&#xff0c;凭本地运行、零代码操作、自动执行任务的优势圈粉无数。它不是普通聊天AI&#xff0c;能直接操控电脑&#xff0c;接收自然语言指令后自动拆解任务&#xff0c;全程无需人工干预。 本文专为CSDN全…...

一次 Nginx 跨域代理的完整排坑实录:从证书错误到 CORS 配置

一次 Nginx 跨域代理的完整排坑实录&#xff1a;从证书错误到 CORS 配置 关键词&#xff1a;Nginx、CORS、跨域、SSL证书、反向代理、预检请求 一、背景与需求 最近在做一个项目&#xff0c;架构如下&#xff1a; 前端域名&#xff1a;https://www.example.com第三方API&…...

OpenClaw低代码实践:Kimi-VL-A3B-Thinking多模态任务可视化编排

OpenClaw低代码实践&#xff1a;Kimi-VL-A3B-Thinking多模态任务可视化编排 1. 为什么需要低代码多模态任务编排 去年我接手了一个数据分析项目&#xff0c;需要每天从几十个网页截图并提取关键信息。最初尝试用Python脚本OpenCV硬编码处理&#xff0c;但每当网页改版就得重写…...

foss_photo_libraries移动端功能详解:从自动上传到多平台支持的终极指南

foss_photo_libraries移动端功能详解&#xff1a;从自动上传到多平台支持的终极指南 【免费下载链接】foss_photo_libraries Free and Open Source Photo Libraries 项目地址: https://gitcode.com/gh_mirrors/fo/foss_photo_libraries 在当今移动优先的时代&#xff0c…...

实战深度:游戏框架渲染冲突问题全解析与解决方案

实战深度&#xff1a;游戏框架渲染冲突问题全解析与解决方案 【免费下载链接】REFramework Mod loader, scripting platform, and VR support for all RE Engine games 项目地址: https://gitcode.com/GitHub_Trending/re/REFramework 一、问题背景&#xff1a;引擎注入…...