尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Oracle 游标更新与删除数据:TaoToken 统一 Key 下的 PL/SQL 实操大纲

Oracle 游标更新与删除数据:TaoToken 统一 Key 下的 PL/SQL 实操大纲 1. Oracle 游标更新与删除数据踩坑记为什么你的 WHERE CURRENT OF 总报错先说结论Oracle 里用显式游标配合WHERE CURRENT OF批量改删数据是后端和 DBA 日常绕不开的一招。它能做到边遍历边定位当前行比再拼一个主键条件更省事也比UPDATE ... WHERE全表扫更可控。但很多人第一次写就翻车——要么忘了FOR UPDATE要么WHERE CURRENT OF找不到游标要么提交时机没想清楚最后锁表锁到业务报警。这篇就围绕 Oracle 游标更新与删除数据这个场景把可复制的游标声明、WHERE CURRENT OF用法、提交与回滚配置讲透再附上执行前后行数校验和异常回滚验证步骤。适合需要批量改删数据的后端开发和 DBA尤其是刚接手历史数据清洗、薪资调整、状态批量流转这类任务的同学。我试过在一个几十万行的员工表上做批量调薪一开始图省事直接UPDATE emp SET sal sal 100 WHERE sal 2000结果没控制好事务粒度锁了一大片行业务侧查询直接排队。后来改成显式游标逐行处理、分批提交才把影响压下来。所以这篇不只是语法更是怎么写得稳。另外提一句写这类脚本时我习惯把模型调用和数据库操作分开管理。像 TaoToken 这种统一 Key 的方式能把多个模型的接入收敛成一套凭证省得在脚本里到处塞不同的 Key。下面会顺带讲怎么把它接进你的开发流程但重点还是 PL/SQL 本身。核心检索词先摆出来Oracle 游标更新与删除数据靠的是FOR UPDATE加WHERE CURRENT OF这对组合。FOR UPDATE在打开游标时锁定结果集对应的行WHERE CURRENT OF则告诉 Oracle就改/删我刚 fetch 出来的那一行。少了任何一个语句都跑不通。2. TaoToken 前置准备统一 Key 怎么配进 Oracle 开发环境在正式写游标之前先把工具链理顺。很多团队现在会用 AI 辅助生成 PL/SQL 片段、审查 SQL 风险或者用 coding agent 帮忙改存储过程。这时候如果每个模型都要单独配 Key管理起来很乱。TaoToken 的思路是提供一个统一入口把模型对话、API 调用、coding plan 这些能力收敛到一套凭证下。你需要先拿到 API Key。访问官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册后进控制台创建 Key。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite Key 管理在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。API 的基础地址是 https://taotoken.net/api 注意这个不带 UTM 参数配置时直接用。如果你只是想让 AI 帮你解释一段游标逻辑、生成测试数据用模型对话就行https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。如果你要长期做数据库脚本开发、让 agent 反复改 PL/SQL那更适合 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 遇到配置问题先翻这里。这里要强调一个原则TaoToken 是帮你管理模型调用的入口不是数据库工具也不替代 SQL Developer、DBeaver 或 sqlplus。你的游标脚本最终还是要在 Oracle 客户端里执行。把 Key 配好是为了让 AI 辅助环节更顺而不是让它去连你的生产库。生产库操作永远走正规客户端和权限控制。配置时通常涉及三件套Base URL、API Key、Model ID。Base URL 填https://taotoken.net/apiKey 填你创建的那串Model ID 按你选的模型填。这三样在 Cline、CC Switch、Codex 这类工具里都要对齐缺一个就连不上。下面第三节会给一段可复制的配置片段。3. 可复制配置游标声明、WHERE CURRENT OF 与 settings 片段先给最核心的游标更新模板。注意FOR UPDATE必须写在游标定义里WHERE CURRENT OF必须引用同一个游标名。DECLARE CURSOR emp_cursor IS SELECT ename, sal FROM emp FOR UPDATE; v_ename emp.ename%TYPE; v_sal emp.sal%TYPE; BEGIN OPEN emp_cursor; LOOP FETCH emp_cursor INTO v_ename, v_sal; EXIT WHEN emp_cursor%NOTFOUND; IF v_sal 2000 THEN UPDATE emp SET sal sal 100 WHERE CURRENT OF emp_cursor; END IF; END LOOP; CLOSE emp_cursor; COMMIT; END; /删除版本同理把UPDATE换成DELETEDECLARE CURSOR emp_cursor IS SELECT ename, sal, deptno FROM emp FOR UPDATE; v_ename emp.ename%TYPE; v_sal emp.sal%TYPE; v_deptno emp.deptno%TYPE; BEGIN OPEN emp_cursor; LOOP FETCH emp_cursor INTO v_ename, v_sal, v_deptno; EXIT WHEN emp_cursor%NOTFOUND; IF v_deptno 30 THEN DELETE FROM emp WHERE CURRENT OF emp_cursor; END IF; END LOOP; CLOSE emp_cursor; COMMIT; END; /关键点FOR UPDATE会锁定查询到的行直到你COMMIT或ROLLBACK。所以事务粒度一定要想清楚。数据量大时别一次性全锁建议分批提交。如果你用 Cline 或类似工具做 AI 辅助开发配置片段大概长这样JSON 形式路径按你本地实际改{ baseUrl: https://taotoken.net/api, apiKey: 你的_TAOTOKEN_KEY, modelId: 你选择的模型ID }Codex 的auth.json也是三件套对齐{ base_url: https://taotoken.net/api, api_key: 你的_TAOTOKEN_KEY, model: 你选择的模型ID }CC Switch 里同样填 Base URL、Key、Model ID 三项。这三件套任何一项写错都会在调用时报 401 或连接失败。配好后建议先用模型对话页发一条测试请求确认凭证有效再去写游标脚本。再补一个分批提交的写法避免大事务锁表DECLARE CURSOR emp_cursor IS SELECT ename, sal FROM emp FOR UPDATE; v_ename emp.ename%TYPE; v_sal emp.sal%TYPE; v_cnt NUMBER : 0; BEGIN OPEN emp_cursor; LOOP FETCH emp_cursor INTO v_ename, v_sal; EXIT WHEN emp_cursor%NOTFOUND; IF v_sal 2000 THEN UPDATE emp SET sal sal 100 WHERE CURRENT OF emp_cursor; v_cnt : v_cnt 1; END IF; IF MOD(v_cnt, 500) 0 THEN COMMIT; END IF; END LOOP; CLOSE emp_cursor; COMMIT; END; /每 500 行提交一次既控制锁范围又不会因为一次大回滚把 undo 撑爆。这个数字按你表的大小和业务容忍度调。4. 验证请求与成功结果行数校验和异常回滚实测写完脚本不能直接在生产跑先做行数校验。执行前先记下目标行数SELECT COUNT(*) FROM emp WHERE sal 2000;假设结果是 120。执行游标更新后再查一次SELECT COUNT(*) FROM emp WHERE sal 2000;如果调薪后这些行工资都涨到 2000 以上这个数应该变成 0 或明显减少。同时校验总行数没变SELECT COUNT(*) FROM emp;更新操作不该改变总行数如果变了说明脚本逻辑有问题。删除操作则相反总行数应该减少减少量等于你预期删除的行数。异常回滚验证更关键。故意在脚本里制造一个错误比如除零看事务是否整体回滚DECLARE CURSOR emp_cursor IS SELECT ename, sal FROM emp FOR UPDATE; v_ename emp.ename%TYPE; v_sal emp.sal%TYPE; v_tmp NUMBER; BEGIN OPEN emp_cursor; LOOP FETCH emp_cursor INTO v_ename, v_sal; EXIT WHEN emp_cursor%NOTFOUND; IF v_sal 2000 THEN UPDATE emp SET sal sal 100 WHERE CURRENT OF emp_cursor; v_tmp : 1 / 0; -- 故意触发异常 END IF; END LOOP; CLOSE emp_cursor; COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; RAISE; END; /跑完后查SELECT COUNT(*) FROM emp WHERE sal 2000;如果还是原来的 120说明回滚生效没有半途提交的脏数据。这一步能验证你的异常处理分支是否真的兜住了。成功结果长这样脚本执行无报错DBMS_OUTPUT或你加的日志显示处理行数提交后查询结果符合预期且没有残留锁。可以用下面这句查当前会话的锁情况SELECT sid, type, id1, id2, lmode, request, block FROM v$lock WHERE type TX;如果脚本结束后还有大量 TX 锁没释放说明有事务没提交或没回滚赶紧排查。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth这一节把真实会撞上的报错列出来对照着查。ORA-01002: fetch out of sequence。这个最常见通常是你在FOR UPDATE游标里做了COMMIT提交后游标位置失效再FETCH就报这个。解决办法是把提交放到循环外或者用分批提交时重新打开游标。别在 fetch 循环中间随便 commit。ORA-01410: invalid ROWID或WHERE CURRENT OF找不到行。多半是游标定义没带FOR UPDATE或者你引用的游标名和定义的不一致。检查游标声明和WHERE CURRENT OF后面的名字是否完全一样。401 Unauthorized。这是 TaoToken 侧的凭证问题不是 Oracle 的。检查你的 API Key 是否填对、是否过期Base URL 是否是https://taotoken.net/api。三件套里任何一项错都会 401。去 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 重新确认 Key。local proxy failed。一般是本地网络或代理配置问题检查你的工具是否误设了代理或者 Base URL 写成了带路径的错误地址。确认用的是https://taotoken.net/api不要多加斜杠或后缀。reading choices 相关报错。这类通常出现在模型返回结构解析阶段说明请求发出去了但响应格式不符合预期。检查 Model ID 是否填对是否选了一个当前不可用的模型。换一个模型 ID 再试。OAuth 相关报错。如果你用的是需要 OAuth 流程的工具检查授权是否完成、token 是否过期。有些工具会缓存旧 token清掉重新授权。锁等待超时 ORA-30006 或 enq: TX - row lock contention。说明你的游标锁住了别的会话要改的行。要么缩短事务、分批提交要么调整业务执行时间窗口。生产上批量改删一定要避开高峰。排查顺序建议先看 Oracle 报错码确认是 SQL 层还是凭证层SQL 层看游标定义和提交时机凭证层看三件套。两边分开查别混在一起。6. 语义一致 CTA把游标脚本和模型调用都管起来回到开头那个问题Oracle 游标更新与删除数据核心就是FOR UPDATE加WHERE CURRENT OF配上合理的事务粒度。脚本本身不难难的是锁控制、提交时机和异常回滚。把这三样做扎实批量改删就不会变成生产事故。如果你在写这类脚本时需要 AI 辅助生成、审查或解释 PL/SQL建议把模型调用统一到一套 Key 下管理。模型对话入口在 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 适合临时问语法、查报错。长期做数据库脚本开发和 agent 迭代用 Coding Plan 更合适https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。接入细节和配置示例翻文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。最后留个实操建议任何批量改删脚本先在测试库跑一遍行数校验和异常回滚验证确认无误再上生产。生产执行前先备份目标表或者至少记下执行前的行数和关键字段快照。游标锁行这件事宁可分批慢一点也别一次性锁死整张表。
返回列表