1. 为什么存储过程里的游标总在“多读一行”上翻车MySQL 游标CURSOR是存储过程/函数里逐行处理结果集的句柄DECLARE声明、OPEN打开、FETCH取值、CLOSE关闭。它适合“每行都要做复杂判断、写日志、调外部接口”的场景因为SELECT *一次性把结果全取出来没法在行与行之间插入业务逻辑。适合谁写定时对账、批量状态机、逐行调用 AI 接口做文本清洗的后端同学。真正让人头疼的不是语法而是边界FETCH超过总行数会报NOT FOUND用REPEAT配合计数器容易多输出一行用CONTINUE HANDLER又可能把最后一行重复处理。我试过在批量给商品生成摘要时就因为 handler 选错最后一条记录被调了两次模型接口白白多花 token。这篇把游标骨架和 TaoToken 统一 Key/API 通道的配置放在一起讲存储过程负责逐行取数TaoToken 负责把每行文本送到模型侧两者通过一张小表验证逐行结果与错误处理。下面所有代码都可直接复制到本地 MySQL 8.x 跑通。2. TaoToken 前置统一 Key 与 API 通道准备TaoToken 在这里的角色是“统一出口”存储过程本身不直接发 HTTP而是把待处理的行写进队列表由外部脚本读取后调用 TaoToken 的 API。这样做的原因是 MySQL 存储过程发网络请求能力弱、难排障拆开更稳。你需要先拿到一个 Key并确认两件事Base URL 用https://taotoken.net/api注意不带任何查询参数模型名按控制台里可用的填。获取入口在 API Keys接入细节看 接入文档。想先验证模型通不通用 模型对话 发一条测试消息最快。注意Key 只放在服务端环境变量或配置文件里别写进存储过程、别提交到 Git。存储过程里出现明文 Key 等于把钥匙贴在门上。配置骨架分两份一份给外部调用脚本config.toml一份给编辑器/Agent 侧settings.json。两者都指向同一个 Base URL只是用途不同。3. 可复制配置游标骨架 TaoToken 配置片段3.1 建一张小表用于验证CREATE TABLE goods ( gid INT PRIMARY KEY AUTO_INCREMENT, num INT NOT NULL, name VARCHAR(50) NOT NULL, summary VARCHAR(200) DEFAULT NULL ); INSERT INTO goods (num, name) VALUES (1, 猫), (2, 狗), (3, 猪);3.2 游标 EXIT HANDLER 的正确骨架关键点用EXIT HANDLER FOR NOT FOUND触发后直接跳出循环体不会多执行一次SELECT。变量声明必须在游标之前。DELIMITER $$ CREATE PROCEDURE p_cursor_goods() BEGIN DECLARE row_gid INT; DECLARE row_num INT; DECLARE row_name VARCHAR(20); DECLARE done INT DEFAULT 0; DECLARE cur_goods CURSOR FOR SELECT gid, num, name FROM goods ORDER BY gid; DECLARE EXIT HANDLER FOR NOT FOUND SET done 1; OPEN cur_goods; read_loop: LOOP FETCH cur_goods INTO row_gid, row_num, row_name; IF done 1 THEN LEAVE read_loop; END IF; -- 这里写逐行业务逻辑例如写入待处理队列 INSERT INTO goods_queue (gid, payload, status) VALUES (row_gid, CONCAT(row_num, :, row_name), PENDING); END LOOP; CLOSE cur_goods; END$$ DELIMITER ;调用CALL p_cursor_goods();然后SELECT * FROM goods_queue;应得到 3 行不多不少。3.3 TaoToken 配置片段外部脚本读取队列表后调用模型配置如下。config.toml[taotoken] base_url https://taotoken.net/api api_key ${TAOTOKEN_API_KEY} model your-model-name timeout 30 [worker] batch_size 20 max_retry 3settings.json编辑器/Agent 侧{ taotoken: { baseUrl: https://taotoken.net/api, apiKeyEnv: TAOTOKEN_API_KEY, model: your-model-name } }环境变量export TAOTOKEN_API_KEY你的Key。长期跑批量编码或 Agent 任务用 Coding Plan 更省心临时调试在 Console 看用量。4. 验证请求逐行结果与错误处理实测4.1 验证游标逐行输出先建队列表CREATE TABLE goods_queue ( id INT PRIMARY KEY AUTO_INCREMENT, gid INT, payload VARCHAR(200), status VARCHAR(20) DEFAULT PENDING, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );执行CALL p_cursor_goods();后查询SELECT gid, payload, status FROM goods_queue ORDER BY gid;预期三行1 | 1:猫、2 | 2:狗、3 | 3:猪。如果出现第四行空值说明 handler 用了CONTINUE且SELECT在FETCH之后改成EXIT或调整语句顺序即可。4.2 验证 TaoToken 请求用 curl 确认通道可用curl -s https://taotoken.net/api/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: your-model-name, messages: [{role: user, content: 把 1:猫 扩写成一句商品描述}] }返回里能看到choices[0].message.content即通道正常。把队列表里statusPENDING的行逐条取出、调用、回写statusDONE和summary就完成了“游标逐行 模型逐行”的闭环。4.3 错误处理验证故意把模型名写错观察脚本是否按max_retry重试并把status置为FAILED。再测空表场景清空goods后调用存储过程goods_queue应保持 0 行不产生空记录——这正是EXIT HANDLER相比计数器方案更干净的地方。5. 本篇常见错排查报错 1329 No data - zero rows fetchedFETCH越界且没有 handler。补DECLARE EXIT HANDLER FOR NOT FOUND。最后一行重复输出用了CONTINUE HANDLER且SELECT写在FETCH之后。要么换EXIT要么把输出语句放到FETCH之前并先做一次预取。变量声明顺序报错DECLARE变量必须全部在游标和 handler 之前顺序错了直接语法失败。401 / 403Key 没读到或环境变量名不一致。检查echo $TAOTOKEN_API_KEY是否有值config.toml里的${...}是否被脚本正确展开。超时timeout调大或把batch_size调小避免单次请求体过大。队列表堆积worker 没起或status没回写。先SELECT COUNT(*) FROM goods_queue WHERE statusPENDING;定位。6. 把逐行处理接进你的统一通道游标的价值在于“一行一行来”TaoToken 的价值在于“一个 Key 走通模型侧”。两者拼起来存储过程只管取数和落队列外部脚本只管调用和回写职责清晰、排障简单。接入配置和 Key 管理统一在 API Keys 与 接入文档模型连通性用 模型对话 快速确认长期批量任务走 Coding Plan。官网入口https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。
企业数字化 ERP 产品动态
相关推荐
Nestjs框架: gRPC微服务通信及安全实践全解析(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/9/25 14:01:16
OpenHands 配 TaoToken:CLI / SDK / 网页 / 云端全链路接入指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 14:00:52
Linux下Eclipse安装与TaoToken配置:从环境准备到settings.json骨架 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 14:00:46
OpenChamber 新特性前瞻:Session Timeline 时间线视图、扩展浏览器代理与全类型文件预览 AI Agent人工智能代码智能体交互助手 【免费下载链接】openchamber Agentic Development Environment based on OpenCode AI agent 项目地址: https://gitcode.com/gh_mirrors/op/openchamber 点击查看 免费下载 本文基于仓库中 changelog/unreleased.md 记录的下一… · 2026/9/25 15:35:22
Atlas 300V部署YOLO全流程:从环境配置到性能实测与踩坑记录 前阵子一位做安防项目的朋友,拿着块 Atalas 300V 24G 的卡过来问我:这玩意儿是不是运算加速卡?我说是,但你得先搞清楚,它加速的是“推理”,不是“训练”。后来他又问,现有这套 YOLO 检测模型能不… · 2026/9/25 15:35:10
国产麒麟系统安装部署OpenClaw完整指南(适配V10/VSP)国产操作系统的AI智能体部署 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 15:35:10
Flink+Iceberg实时数据湖落地指南:链路搭建、参数调优与避坑实践 简介:实时数据处理正在从传统的Lambda架构向流批一体演进,核心挑战在于如何在持续写入的同时保证数据的一致性、可回溯性与查询性能。Iceberg作为一种表格式而非存储引擎,通过快照和ACID机制,让Flink的流式写入能够组织成结构清晰… · 2026/9/25 15:35:10
昇腾Atlas 300V 24G推理卡部署YOLOv5实战:从环境配置到性能调优 拿到这块卡的第一周,我基本处于"反复装驱动、反复重启、反复看npu-smi info"的状态。Atlas 300V 24G在网上资料不算少,但杂,且版本之间差异很大。直到把一个YOLOv5模型跑起来、延时打点稳定在个位数毫秒级,才觉得这卡真… · 2026/9/25 15:35:04
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37