【问题标题】:Inserting a single sequence value on multiple rows在多行上插入单个序列值
【发布时间】:2011-06-18 20:21:59
【问题描述】:

我正在尝试向表中插入多条记录,但对每条记录使用相同的序列值。

这类似于:How can I insert multiple rows into oracle with a sequence value? 但是给出的答案插入了多个不同的序列号,我希望多个记录使用相同的序列号。

create table test1  ( 
  col_a number, 
  col_b number
);
commit;

create sequence test_seq increment by 1 start with 2 minvalue 1 nocycle nocache noorder;
commit;

insert into test1 (col_a, col_b) 
select a.object_id, test_seq.nextval from (
  select object_id from all_objects where rownum < 5
) a;
commit;

上面的问题是它检索并插入多个(不同的)“test_seq.nextval”值,我希望为每一行插入相同的值。

这甚至可以在直接 sql 中不借助触发器(或多个 sql 语句)吗?相关问题的答案之一暗示它可能不是,但我并不清楚。

谢谢。
如果有帮助,我正在使用 Oracle 11g。

【问题讨论】:

    标签: sql oracle oracle11g sequences


    【解决方案1】:

    使用currval 而不是nextval

    select test_seq.nextval from dual;
    
    insert into test1 (col_a, col_b)
    select a.object_id, test_seq.currval from (
      select object_id from all_objects where rownum < 5
      ) a;
    

    我知道没有两个语句可以做到这一点,第一个是递增序列(因此可以通过 currval 进行选择),第二个是使用 currval。

    【讨论】:

    • 谢谢。我希望有一条 sql 语句,但这还不错。我知道“currval”,但由于某种原因并没有在这种情况下考虑它。如果没有人在单个 stmt 中找到方法,我会接受这个答案。
    • 如果有单语句解决方案,我当然有兴趣了解它。
    • 为什么要一个语句?将其放入单个 pl/sql 块是否算作单个语句,即单个可执行命令?
    • @araqnid:哈哈...没有真正的理由想要一个单一的stmt。如果规范的答案是使用 2 个 sql stmts,那很好。 ..它似乎应该在一个单一的 stmt 中很容易做到(我就是想不通)。
    • @OMG:谢谢。不过我觉得还可以。它将在一个事务中,当我从另一个会话调用 NEXTVAL 时,CURRVAL 不会改变。我对此进行了测试(并对它的工作原理感到惊喜)
    猜你喜欢
    • 1970-01-01
    • 2011-06-14
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 2021-11-19
    • 2019-09-09
    • 2012-08-01
    相关资源
    最近更新 更多