PL/SQL中如何遍历关联数组变量并插入数据到目标表?
问题解决:正确遍历INDEX BY类型集合插入数据
你编译报错p_emp is not a cursor的原因是:你把INDEX BY类型的集合(关联数组)当成游标来遍历了,这类集合属于PL/SQL集合类型,不能使用游标遍历的语法,得用集合专属的遍历方式。
以下是两种正确的实现方式:
方式1:逐行遍历插入(适合小数据量)
利用集合的FIRST/NEXT方法遍历所有索引(支持索引不连续的场景),或者用连续索引的FOR循环:
CREATE OR REPLACE PACKAGE MYPKG IS TYPE EMPREC IS RECORD( fname VARCHAR2(50), lname VARCHAR2(50), idty VARCHAR2(20) ); TYPE emprectype IS TABLE OF EMPREC INDEX BY BINARY_INTEGER; PROCEDURE proc_aaa(p_emp emprectype); END MYPKG; / CREATE OR REPLACE PACKAGE BODY MYPKG IS PROCEDURE proc_aaa(p_emp emprectype) IS v_index BINARY_INTEGER; BEGIN -- 通用遍历方式(支持索引不连续) v_index := p_emp.FIRST; WHILE v_index IS NOT NULL LOOP INSERT INTO TABLE_BB(firstname, lastname, id) VALUES(p_emp(v_index).fname, p_emp(v_index).lname, p_emp(v_index).idty); v_index := p_emp.NEXT(v_index); END LOOP; -- 若确定索引连续,可简化为FOR循环 -- FOR i IN p_emp.FIRST .. p_emp.LAST LOOP -- INSERT INTO TABLE_BB(firstname, lastname, id) -- VALUES(p_emp(i).fname, p_emp(i).lname, p_emp(i).idty); -- END LOOP; COMMIT; -- 根据业务需求决定是否提交事务 END proc_aaa; END MYPKG; /
方式2:批量插入(推荐,大数据量更高效)
使用Oracle的FORALL语句执行批量DML操作,减少SQL与PL/SQL的上下文切换,大幅提升效率:
CREATE OR REPLACE PACKAGE BODY MYPKG IS PROCEDURE proc_aaa(p_emp emprectype) IS BEGIN FORALL i IN p_emp.FIRST .. p_emp.LAST INSERT INTO TABLE_BB(firstname, lastname, id) VALUES(p_emp(i).fname, p_emp(i).lname, p_emp(i).idty); COMMIT; END proc_aaa; END MYPKG; /
注意事项
- 确保
emprectype类型定义在包规范中(或全局可见),调用方才能正确传入参数。 - 检查字段类型兼容性:
TABLE_BB的id字段需与EMPREC的idty字段类型匹配,避免插入时类型错误。
内容的提问来源于stack exchange,提问作者Balaganesh Mohanavel
相关产品推荐
相关产品推荐

