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

如何在PL/SQL中使用游标FOR循环实现表间行插入?(含错误排查)

PL/SQL游标FOR循环实现表行插入及ORA-00947错误解决

错误原因

ORA-00947错误是因为你在INSERT语句的VALUES(i)中直接传递了游标记录变量i,Oracle无法将整个记录变量解析为目标表所需的列值集合,必须明确指定记录字段或使用兼容的语法。

修正后的游标FOR循环代码

方式一:逐个指定记录字段

若dept_backup表的列结构(数量、顺序、数据类型)与dept完全一致,可展开记录中的每个字段:

DECLARE    
    CURSOR cur_depts IS
    SELECT *
    FROM dept;
BEGIN
    FOR i IN cur_depts
    LOOP
       INSERT INTO dept_backup
       VALUES(i.deptno, i.dname, i.loc); -- 明确传入记录的每个字段
    END LOOP;
    -- 游标FOR循环会自动完成游标打开、遍历、关闭,无需手动执行CLOSE
END;
/

方式二:直接使用记录变量插入

Oracle支持将结构匹配的记录变量直接插入表中,只需调整INSERT语句的写法:

DECLARE    
    CURSOR cur_depts IS
    SELECT *
    FROM dept;
BEGIN
    FOR i IN cur_depts
    LOOP
       INSERT INTO dept_backup
       VALUES i; -- 去掉括号,直接传入记录变量
    END LOOP;
END;
/

这种写法要求dept_backup的列结构必须与游标查询结果完全匹配。

更高效的替代方案

如果只是复制dept的所有行到dept_backup,无需使用游标循环,单条INSERT...SELECT语句性能远高于PL/SQL循环:

INSERT INTO dept_backup
SELECT * FROM dept;

内容的提问来源于stack exchange,提问作者John Joy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 04:39:20