Oracle:使用 select 插入不返回批量收集新插入的 id
Posted
技术标签:
【中文标题】Oracle:使用 select 插入不返回批量收集新插入的 id【英文标题】:Oracle: insert using select is not returning bulk collect newly inserted ids 【发布时间】:2014-02-03 07:39:05 【问题描述】:表名:T_record
Id(auto increment using sequence) Name Age
1 Chitta 18
2 Chitta1 19
3 Chitta2 18
4 Chitta3 18
我有 PL/SQL 程序,它将在上表中插入记录。
Insert into T_record (name, Age)
(select name, age
from T_record
where Age =18)
returning id bulk collect into v_newly_added_conf_input_ids;
但是批量收集不起作用。
我如何知道新插入的id
s(我希望它在其他选择查询中使用相同的id
s)?
【问题讨论】:
“不工作”以什么方式? 返回 id 批量收集到 v_newly_added_conf_input_ids 是的,很明显——但是您遇到错误了吗?它“不起作用”的迹象或症状是什么? 【参考方案1】:不,你不能让它这样工作。只有当insert
语句使用values
子句时,您才能使用returning
(不是批量收集)子句。
您可以使用这种解决方法来获取那些id
s:
您首先使用要插入的值填充一个集合,然后使用forall
构造插入数据并将id
s 返回到另一个集合中:
/* identity column is a 12c feature. In prior versions you use
sequences - not the main point here. Use it just to save time.
*/
create table t1(
t1_id number generated as identity primary key,
name1 varchar2(31),
age number
) ;
PL/SQL 块:
declare
/* record */
type t_rec is record(
name1 varchar2(32),
age number -- as a side note, it's better to store
); -- date of birth not the age - not that dependable.
type t_source_list is table of t_rec;
type t_id_list is table of number;
l_source_list t_source_list; -- source collection
l_id_list t_id_list; -- collection we are going to put IDs into
begin
/* data we are going to insert
replace this query with yours */
select dbms_random.string('l', 7)
, level
bulk collect into l_source_list
from dual
connect by level <= 11;
/* insert data and return IDs into l_id_list collection */
forall i in l_source_list.first..l_source_list.last
insert into t1(name1, age)
values(l_source_list(i).name1, l_source_list(i).age)
returning t1_id bulk collect into l_id_list;
/* print the list of new IDs. */
for i in l_id_list.first .. l_id_list.last loop
dbms_output.put_line('ID #' || to_char(I)||': '||to_char(l_id_list(i)));
end loop;
end;
/
结果:
anonymous block completed
ID #1: 1
ID #2: 2
ID #3: 3
ID #4: 4
ID #5: 5
ID #6: 6
ID #7: 7
ID #8: 8
ID #9: 9
ID #10: 10
ID #11: 11
【讨论】:
以上是关于Oracle:使用 select 插入不返回批量收集新插入的 id的主要内容,如果未能解决你的问题,请参考以下文章
Oracle 返回语句以使用“select from”源进行插入操作
oracle之数据同步:Oracle Sql Loader使用说明(大批量快速插入数据库记录)