ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Oracle触发过程 date_solar 动态 SQL 异常?用 TaoToken 接入的 Codex 排查

Oracle触发过程 date_solar 动态 SQL 异常?用 TaoToken 接入的 Codex 排查 1. 这个 date_solar 过程为什么总跑不出预期结果如果你写过 Oracle 的create or replace procedure date_solar大概率踩过同一类坑游标emp_cursor从solar_invertor逐行读循环里用execute immediate拼一条insert ... select ... from solar_invertordata sample(10) where rownum2跑完发现插入行数不对、snumber没进去、或者干脆报 ORA-00933、ORA-00936 这类语法错。问题不在 Oracle 本身而在动态 SQL 的引号层数、sample与rownum的执行顺序、以及commit放的位置。这篇是排障视角我按“先定位、再核对、后验证”的顺序走一遍。核心工具是 TaoToken 接入的 Codex把date_solar的代码和 SQLPlus 里的报错/结果贴给它让它逐段核对绑定变量、execute immediate拼接和commit位置你拿到修改建议后回本地 SQLPlus 执行验证。适合正在写 PL/SQL 存储过程、被动态 SQL 引号绕晕、又不想让 AI 直接连生产库的开发者。先说清楚边界TaoToken 只负责给 Codex 提供 Key 和 Base URL不碰你的数据库。排查过程全程在你本地 SQL*Plus 完成AI 只做代码审阅和改写建议。2. 用 TaoToken 给 Codex 配好入口原文里是直接在 Oracle 客户端建过程、调试现在改成先让 Codex 能读到你的代码。第一步打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 注册账号进控制台创建 API Key。这个 Key 后面填进 Codex 的配置里。创建 Key 的入口在控制台的 API Keys 页面建议单独建一个用于排障的 Key方便后续轮换。拿到 Key 后Codex 的 Base URL 填https://taotoken.net/api注意两点不要加/v1不要带 UTM 参数。Base URL 写错是配不通的最常见原因很多人习惯性补/v1结果请求直接 404。配置项对照如下配置项填写值说明Base URLhttps://taotoken.net/api不加/v1不带 UTMAPI Key控制台创建的 Key单独建排障用 Key模型按 Codex 支持的模型名填用于代码审阅注意TaoToken 在这里的角色只是给 Codex 供 Key 和 Base URL它不会连接你的 Oracle 实例也不接触solar_invertor、solar_invertordata这些业务表。配好之后你可以先用一句简单请求确认通道是通的再进入正式的代码核对。如果这一步就报 401 或 404先回第 5 节排查别急着贴代码。3. 把 date_solar 拆开喂给 Codex 核对配通之后别一股脑把整个过程丢过去。动态 SQL 的错往往集中在三处引号拼接、sample/rownum语义、commit位置。分三段核对定位更快。3.1 先核对引号拼接层数原始拼接里num_eq被包成||num_eq||这是为了让生成的 SQL 里出现单引号包裹的字符串字面量。层数一旦错execute immediate就会报 ORA-00933 或 ORA-00936。把下面这段贴给 Codex让它数清楚每一层引号sql_d : insert into solar_invertordata(sheetid,INVERTORID,ACQUISITIONTIME,RUNNINGSTATE,ACVOLTAGE,ACCURRENT,DCVOLTAGE,DCCURRENT,HEATSINKTEMPERATURE,CURPOWER) select (select sys_guid() from dual), (select ||num_eq|| from dual), (select to_char(sysdate,yyyy-mm-dd hh24:mi) from dual), RUNNINGSTATE,ACVOLTAGE,ACCURRENT,DCVOLTAGE,DCCURRENT,HEATSINKTEMPERATURE,CURPOWER from solar_invertordata sample(10) where rownum2;让 Codex 输出“拼接后实际执行的 SQL 长什么样”你对照num_eq是否被正确包成值。更稳的写法是用绑定变量替代字符串拼接把num_eq作为using参数传进去从根上消掉引号层数问题sql_d : insert into solar_invertordata(sheetid,INVERTORID,ACQUISITIONTIME,RUNNINGSTATE,ACVOLTAGE,ACCURRENT,DCVOLTAGE,DCCURRENT,HEATSINKTEMPERATURE,CURPOWER) select sys_guid(), :1, to_char(sysdate,yyyy-mm-dd hh24:mi), RUNNINGSTATE,ACVOLTAGE,ACCURRENT,DCVOLTAGE,DCCURRENT,HEATSINKTEMPERATURE,CURPOWER from solar_invertordata sample(10) where rownum2; execute immediate sql_d using num_eq;3.2 再核对 sample 与 rownum 的执行顺序sample(10)是按块采样的近似随机rownum2是在结果集上取第一行。两者叠加时rownum过滤发生在sample之后所以最终大概率只拿到 1 行而不是“采样 10% 再取 2 行”。如果你期望的是“随机取 2 行”sample和rownum的组合本身就不对。把这段语义描述给 Codex让它给出替代写法比如用order by dbms_random.value配合fetch first 2 rows only。3.3 最后核对 commit 位置原代码把commit放在for循环之外、end之前也就是整个游标跑完才提交一次。这本身没错但如果循环中途报错前面已执行的insert会全部回滚你会看到“部分数据没进去”。让 Codex 帮你判断是保持循环外单次提交还是改成每轮提交、或者用savepoint做分段回滚。把 SQL*Plus 里的实际报错和影响行数一起贴过去它的判断会更准。4. 回本地 SQL*Plus 验证修改结果Codex 给出改写建议后不要直接在生产库上跑。回本地 SQL*Plus按下面顺序验证。先编译过程确认没有编译错误create or replace procedure date_solar as num_eq varchar(36); sql_d varchar(500); cursor emp_cursor is select * from solar_invertor; begin for solar_data in emp_cursor loop num_eq : solar_data.snumber; sql_d : insert into solar_invertordata(sheetid,INVERTORID,ACQUISITIONTIME,RUNNINGSTATE,ACVOLTAGE,ACCURRENT,DCVOLTAGE,DCCURRENT,HEATSINKTEMPERATURE,CURPOWER) select sys_guid(), :1, to_char(sysdate,yyyy-mm-dd hh24:mi), RUNNINGSTATE,ACVOLTAGE,ACCURRENT,DCVOLTAGE,DCCURRENT,HEATSINKTEMPERATURE,CURPOWER from solar_invertordata sample(10) where rownum2; execute immediate sql_d using num_eq; end loop; commit; end; / show errorsshow errors没有输出说明编译通过。然后单独跑一次插入逻辑看实际影响行数set feedback on select count(*) from solar_invertordata; begin date_solar; end; / select count(*) from solar_invertordata;对比执行前后的行数差和solar_invertor的行数是否一致。如果每个snumber只插了 1 行而你想要 2 行说明sample/rownum那段还得改。把这两次count(*)的结果贴回 Codex让它确认修改是否达到预期。提示验证阶段建议在测试库或本地实例做别拿生产表当试验田。TaoToken 和 Codex 都不接触你的库数据安全靠你自己把关。5. 这类过程常见的报错与排查排障时高频出现的几个现象对照处理ORA-00933SQL 命令未正确结束几乎都是引号层数错execute immediate拼出来的 SQL 多了或少了单引号。把拼接后的 SQL 打印出来看别靠肉眼数。ORA-00936缺失表达式常见于select ||num_eq|| from dual这类子查询被改坏或者sample后面参数写错。让 Codex 逐段还原。插入行数为 0sample(10)在小表上可能采不到块叠加rownum2后直接空集。换成order by dbms_random.value更可控。部分数据未提交commit在循环外中途异常导致整体回滚。确认是否需要分段提交。Codex 请求报 401/404回第 2 节检查 Base URL 是否误加了/v1、Key 是否复制完整。这两个是接入层问题和 PL/SQL 无关。如果排查中需要看接入文档确认参数去 https://taotoken.net/api 对应的文档页想直接对话验证模型行为用模型对话入口长期做编码和 Agent 类任务可以看 Coding Plan。6. 把 Key 用在排查上而不是让 AI 连库这套流程的关键点从 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 拿到的 Key 配通 Codex 后是用来审阅date_solar这类 PL/SQL 过程的不是让 AI 直接连生产库执行。代码和报错你手动贴修改建议你手动回 SQL*Plus 验证中间没有任何自动执行链路。配通过程中如果卡在 Key 或 Base URL先去 API Keys 页面核对再看接入文档模型行为不符合预期时用模型对话单独测一句要把这套审阅流程固化到日常编码里Coding Plan 更合适。排障的终点永远是你在本地 SQL*Plus 里看到的那两行count(*)差值对上了。
返回列表