首次使用SQL FOR循环:如何将提取的TYPE_ID存入新列?
解决schematics表type_id列批量更新的问题
嘿,我看了你写的PL/SQL代码,思路是对的,但有几个小问题导致没法达到预期效果,我来帮你梳理下:
首先说下你代码里的问题:
- 没有WHERE子句的UPDATE会全表更新:你循环里的
update schematics set type_id = TYPE_ID;每次都会把表中所有行的type_id改成当前循环的TYPE_ID,最后所有行都会变成最后一条数据的TYPE_ID值,这肯定不是你想要的。 - 语法错误:
end loop; ) end这里多了一个右括号,会直接导致编译失败。 - 没必要用循环:其实这种批量更新完全不需要逐行循环,单条UPDATE语句就能搞定,效率还高得多。
推荐方案:单条UPDATE语句(高效首选)
先执行添加列的语句,然后直接用一条更新语句完成所有操作:
-- 第一步:添加type_id列 ALTER TABLE schematics ADD type_id NUMBER; -- 第二步:直接批量更新所有行 UPDATE schematics SET type_id = SUBSTR(key, INSTR(key, '|') + 1, INSTR(key, '|', 1, 2) - INSTR(key, '|', 1, 1) - 1); -- 最后提交事务 COMMIT;
这种方式直接对整个表做更新,避免了PL/SQL循环逐行处理的上下文切换开销,数据量大的时候优势特别明显。
如果你想学习FOR循环的正确写法(仅用于学习)
要是你就是想练手PL/SQL的循环语法,那可以用下面的修正版,核心是一定要加WHERE子句锁定当前行:
-- 先添加列 ALTER TABLE schematics ADD type_id NUMBER; DECLARE BEGIN FOR i IN ( SELECT id, -- 给提取的值起别名,避免和列名混淆 SUBSTR(key, INSTR(key, '|') + 1, INSTR(key, '|', 1, 2) - INSTR(key, '|', 1, 1) - 1) AS type_id_val FROM schematics ) LOOP -- 用id匹配当前循环的行,只更新这一行的type_id UPDATE schematics SET type_id = i.type_id_val WHERE id = i.id; -- 这里假设id是表的主键或唯一标识列 END LOOP; COMMIT; END; /
这里要注意:必须确保id是表的唯一标识(比如主键),不然可能会更新多行。
内容的提问来源于stack exchange,提问作者PhilipBSS
相关产品推荐
相关产品推荐

