You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

首次使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:12:25