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;

但是批量收集不起作用。

我如何知道新插入的ids(我希望它在其他选择查询中使用相同的ids)?

【问题讨论】:

“不工作”以什么方式? 返回 id 批量收集到 v_newly_added_conf_input_ids 是的,很明显——但是您遇到错误了吗?它“不起作用”的迹象或症状是什么? 【参考方案1】:

不,你不能让它这样工作。只有当insert 语句使用values 子句时,您才能使用returning(不是批量收集)子句。

您可以使用这种解决方法来获取那些ids:

您首先使用要插入的值填充一个集合,然后使用forall 构造插入数据并将ids 返回到另一个集合中:

/* 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使用说明(大批量快速插入数据库记录)

在Oracle中,通过一个INSERT ALL语句批量插入数据

mybatis oracle -批量插入,存在则更新

oracle批量插入優化方案

Apache Impala(五) Impala数据导入方式