oracle - 是否可以在 Insert as select 语句上返回主键 - Oracle?

标签 oracle oracle-apex sql-insert database-trigger

因此,在使用触发器时,我通常会获取新插入记录的主键,如下所示。

insert into table1 (pk1, notes) values (null, "Tester") returning pk1 into v_item;

我正在尝试使用相同的概念,但使用 select 语句进行插入。例如:

insert into table1 (pk1, notes) select null, description from table2 where pk2 = 2 returning pk1 into v_item;

注意:
1. table1 上有一个触发器,它会在插入时自动创建 pk1。
2. 由于要插入的表的大小,我需要使用选择插入。
3.插入基本上是记录的副本,因此一次只能插入1条记录。

如果我可以提供更多信息,请告诉我。

最佳答案

我不相信你可以直接通过插入/选择来做到这一点。但是,您可以使用 PL/SQL 和 FORALL 来完成此操作。考虑到表大小的限制,您必须使用 l_limit 平衡内存使用和性能。这是一个例子...

假设此表有 100 行:

create table t (
  c  number generated by default as identity,
  c2 number
);

insert into t (c2)
select rownum
from dual
connect by rownum <= 100;

你可以这样做:

declare

  cursor t_cur
  is
    select c2
    from t;

  type t_ntt is table of number;

  l_c2_vals_in t_ntt;
  l_c_vals_out t_ntt;
  l_limit      number := 10;

begin

  open t_cur;

  loop
    fetch t_cur bulk collect into l_c2_vals_in limit l_limit;

    forall i in indices of l_c2_vals_in
    insert into t (c2) values (l_c2_vals_in(i))
    returning c bulk collect into l_c_vals_out;

    -- You have access to the new ids here
    dbms_output.put_line(l_c_vals_out.count);

    exit when l_c2_vals_in.count < l_limit;
  end loop;

  close t_cur;

end;

关于oracle - 是否可以在 Insert as select 语句上返回主键 - Oracle?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60380206/

相关文章:

java - DatabaseMetaData.getColumns() 在使用小写表名时返回空结果集,但在大写时返回正确的结果集

sql - Oracle SQL 中的 If 条件

oracle-apex - Oracle APEX - 如何在保存过程执行后刷新交互式网格

java - Oracle - 如何在不格式化的情况下将 Java 项目中的时间戳插入为字符串

sql - 如何使用for循环函数在postgresql中插入数据?

c# - XML 到 Oracle 数据库列映射

oracle - Perl install_driver(Oracle) 失败: - 无法为模块 DBD::Oracle Win64 加载 '../DBD/Oracle/Oracle.dll'

javascript - Oracle Apex JavaScript 问题

html - Oracle APEX 使用 PL/SQL 查询更改仅显示元素的颜色

java - 在 Android Room 中使用 @Insert 注释跳过 null