Oracle - 如何在一个查询中批量插入值,并使用值数组插入

时间:2016-06-13 15:37:58

标签: sql oracle

我有这些表格:

A {
id,
name
}

B {
id,
name,
aId
}

aId是表A的外键

所以我有一个需要插入表B的字符串列表。

List: names['name1', 'name2']

此外,我还有一个select语句,它会提取一个A.id的列表。

List: id's[1, 2]

问题是表B需要为每个被查询的A.id插入行,同时应该考虑字符串列表。

最终结果是我得到了id(1,2),所以创建了4行(每个id为2,因为每个id都需要在列表中插入所有字符串):

insert into b (id, name, aId) values (b_id_seq.nextval, name1, 1)
insert into b (id, name, aId) values (b_id_seq.nextval, name2, 1)

insert into b (id, name, aId) values (b_id_seq.nextval, name1, 2)
insert into b (id, name, aId) values (b_id_seq.nextval, name2, 2)

我的工作是编写select语句,它返回一个id的数组。我也尝试用这两个列表实现一个选择,但没有运气。

第一次尝试是在特定列值部分内使用IN子句,第二次尝试是使用INSERT ALL。无法弄清楚如何在最后一种情况下动态生成插入语句。

如何解决这种INSERT语句?

1 个答案:

答案 0 :(得分:1)

这听起来像是使用PL / SQL的好人选。你可以用这个做动态查询...但事实上你可能不需要这样做,并且可以使用一些游标。

create proc myproc(inListName in customType)
as

--this cursor would get you your list of IDs...
cursor1 is
   select id from table;

c1row cursor1%rowtype;

begin

  --this cursor opens and is effectively your "outer loop"
  open cursor1;
  LOOP
    -- Retreive one row.
    FETCH cursor1 INTO c1row;
    EXIT WHEN cursor1%NOTFOUND;
      --not exact syntax here.. but you get the idea...
      FOR name IN inListNames
      LOOP
        insert into b (id, name, aId) values (b_id_seq.nextval, name, c1row.id);
      END LOOP;          

  END LOOP;
  close cursor1;
end
/

注意:这是未经测试的,只是在我的脑海中......但它可以用于这些方面的东西。如果您使用大量数据执行此操作,我建议您改为执行BULK INSERT(只是谷歌Oracle批量插入...)并使用它,因为性能方面它会更好。

注意2:这是使用自定义数据类型在包含您的名称列表的参数中进行PASS。这是一个链接,向您展示如何设置用户定义的类型来执行此操作 Passing an array of data as an input parameter to an Oracle procedure

或者,如果这对你来说太过于过度杀戮,或者你觉得它过度设计,也许你可以以某种方式运行一个可以获得这些名字列表的查询?如果是这种情况,你可以创建第二个游标来获取名称列表并迭代它。