如何在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
相关产品推荐
相关产品推荐

