Oracle SQL Developer中无需游标遍历表并插入数据的方法
Oracle无游标实现批量插入方案
前提说明
现有MainTable的定义中缺少期望结果里的ReservationId字段,需先添加该字段才能插入对应数据:
ALTER TABLE MainTable ADD ReservationId NUMBER;
批量插入实现(无游标)
使用Oracle的INSERT ... SELECT语句完成批量插入,这是集合式操作,无需游标即可批量处理数据:
方案1:用CASE匹配对应MainTableData值
如果MainTable的Id字段允许临时用ROWNUM生成自增ID,可直接执行:
INSERT INTO MainTable (Id, StatusTableId, ReservationId, MainTableData) SELECT ROWNUM, s.Id, 1 AS ReservationId, CASE s.Id WHEN 11 THEN 'ancsd' WHEN 22 THEN 'dadsa' WHEN 33 THEN 'adasd' END AS MainTableData FROM Status s WHERE s.Id IN (11, 22, 33);
方案2:用序列生成持久化自增Id(适配Oracle 11g及更早版本)
若MainTable的Id字段需要持久化的自增逻辑,先创建序列:
CREATE SEQUENCE main_table_seq START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE;
再执行插入:
INSERT INTO MainTable (Id, StatusTableId, ReservationId, MainTableData) SELECT main_table_seq.NEXTVAL, s.Id, 1 AS ReservationId, CASE s.Id WHEN 11 THEN 'ancsd' WHEN 22 THEN 'dadsa' WHEN 33 THEN 'adasd' END AS MainTableData FROM Status s WHERE s.Id IN (11, 22, 33);
补充说明
- 上述方法均为集合操作,相比游标效率更高,无需逐行遍历处理
WHERE s.Id IN (11,22,33)确保只插入指定的Status记录- 若使用Oracle 12c及以上版本,可将
MainTable的Id设为IDENTITY列,无需手动指定或创建序列,数据库会自动生成自增ID
内容的提问来源于stack exchange,提问作者soorya kumar
相关产品推荐
相关产品推荐

