加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

将Oracle序列增加一定量

发布时间:2020-12-12 13:15:36 所属栏目:百科 来源:网络整理
导读:我正在编写一个 Windows应用程序(在Qt 4.6中) – 在某些时候 – 将1到76000之间的任意数量的数据集插入到某个oracle(10.2)表中.应用程序必须从序列中检索主键或至少主键范围.然后,它将ID存储在列表中,该列表用于批处理执行准备好的查询. (注意:不应使用触发
我正在编写一个 Windows应用程序(在Qt 4.6中) – 在某些时候 – 将1到76000之间的任意数量的数据集插入到某个oracle(10.2)表中.应用程序必须从序列中检索主键或至少主键范围.然后,它将ID存储在列表中,该列表用于批处理执行准备好的查询.

(注意:不应使用触发器,序列也由其他任务使用)

为了避免调用序列X次,我想用X递增序列.

到目前为止我发现的是,在程序中可以使用以下代码:

ALTER SEQUENCE my_sequence INCREMENT BY X;

SELECT my_sequence.CURVAL + 1,my_sequence.NEXTVAL
INTO   v_first_number,v_last_number
FROM   dual;

ALTER SEQUENCE my_sequence INCREMENT BY 1;

我有两个主要问题:

>我已经读过ALTER SEQUENCE产生一个隐式提交.这是否意味着Windows应用程序启动的事务将被提交?如果是这样,你能以某种方式避免它吗?
>这个概念是多用户证明吗?或者可能发生以下事情:

Sequence is at 10,000
Session A sets increment to 2,000
Session A selects 10,001 as first and 12,000 as last
Session B sets increment to 5,000
Session A sets increment to 1
Session B selects 12,001 as last
Session B sets increment to 1

即使程序相当快,在我的应用程序中也不太可能两个不同的用户几乎同时调用该过程

解决方法

在这种情况下改变序列是非常糟糕的主意.特别是在多用户环境中.您将提交您的事务,可能还有几个“竞争条件”数据错误或完整性错误.
如果您已导入旧数据并且希望使用序列中的ID插入新数据,那将是合适的.然后你可以改变序列以将currval移动到max existing …

在我看来,你想在这里生成序列中的ID.这不需要做

select seq.nextval into l_variable from dual;
insert into table (id,...) values (l_variable,....);

您可以直接在插入中使用序列:

insert into table values (id,...) values (seq.nextval,....);

并可选择获取指定的值

insert into table values (id,....)
returning id into l_variable;

即使是使用execBatch进行批量操作也是可能的.要么只是创建ID,要么甚至返回它们.我不确定java中的正确语法,但它将是关于行的东西

insert into table values (id,....)
returning id bulk collect into l_cursor;

并且您将获得一个ResultSet来浏览分配的数字.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读