我有这些表格:
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语句?
答案 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
或者,如果这对你来说太过于过度杀戮,或者你觉得它过度设计,也许你可以以某种方式运行一个可以获得这些名字列表的查询?如果是这种情况,你可以创建第二个游标来获取名称列表并迭代它。