关于oracle sequence步长 为1 但实际上显示的步长是2 求解释

莫言 2012-11-06 09:32:04
SEQ_ISSUE_POLICY_NONVEH 序列的写法

-- Create sequence
create sequence SEQ_ISSUE_POLICY_NONVEH
minvalue 1
maxvalue 9999999999999999999999999999
start with 3931941
increment by 1
cache 20
order;

触发器的写法

CREATE OR REPLACE TRIGGER "trg_issue_policy_nonveh_insert"
BEFORE INSERT ON "DP"."ISSUE_POLICY_NONVEH_T"
FOR EACH ROW
DECLARE
seqno NUMBER;
BEGIN
select DP.Seq_Issue_Policy_nonVeh.nextval into seqno FROM dual;
:NEW.serialno := seqno ;
END;

验证sql的写法

select
*
from dp.issue_policy_nonveh_t
where serialno /2 = 0

查询不到任何行,也就是说 所有的serialno都是奇数

实际上相对的 还有一组
查询出来的却是偶数

CREATE OR REPLACE TRIGGER "trg_issue_policy_veh_insert" BEFORE INSERT ON "DP"."ISSUE_POLICY_VEH_T" FOR EACH ROW
DECLARE
seqno NUMBER;
BEGIN
select DP.Seq_Issue_Policy_Veh.nextval into seqno FROM dual;
:NEW.serialno := seqno ;
END;

那么实际上这两张ISSUE_POLICY_VEH_T\ISSUE_POLICY_NONVEH_T是在一个存储过程里插入的 但是他们的触发器和序列 都是独立的 为什么会有这种步长为2的情况发生?难道和我在主表insert into xxx
select select /*+parrallel (a,4) (m,4) (pa,4) (pt,4) */ 有关?
...全文
503 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
莫言 2012-11-06
  • 打赏
  • 举报
回复
问题时还有哪边有影响这个自增量的地方呢
forgetsam 2012-11-06
  • 打赏
  • 举报
回复
引用 6 楼 dclove 的回复:
已经验证过相差1啊
这就说明实际步长是1
莫言 2012-11-06
  • 打赏
  • 举报
回复
已经验证过相差1啊
forgetsam 2012-11-06
  • 打赏
  • 举报
回复
序列本身不保证任何的连续性,它就是个生成自增整数的工具。 要想验证步长很简单, select DP.Seq_Issue_Policy_Veh.nextval seqno FROM dual; 连续运行两次,看看两次之间差几。
莫言 2012-11-06
  • 打赏
  • 举报
回复
引用 3 楼 forgetsam 的回复:
引用 2 楼 dclove 的回复:验证sql的写法 select * from dp.issue_policy_nonveh_t where serialno /2 = 0 查询不到任何行,也就是说 所有的serialno都是奇数 这还有什么可解释的,脑袋里有虫。 验证数据你就老老实实查询最新插入的数据,还自己写个SQL, 自己写……
是的 SQL写错了 select * from dp.issue_policy_nonveh_t where mod(serialno,2) = 0 ; 这样的话是0记录 但是 如果mod(serialno,2) = 1 的话 是全纪录
forgetsam 2012-11-06
  • 打赏
  • 举报
回复
引用 2 楼 dclove 的回复:
验证sql的写法 select * from dp.issue_policy_nonveh_t where serialno /2 = 0 查询不到任何行,也就是说 所有的serialno都是奇数
这还有什么可解释的,脑袋里有虫。 验证数据你就老老实实查询最新插入的数据,还自己写个SQL, 自己写个SQL也没事,还写个错的SQL,从这个SQL你能查出来什么?
莫言 2012-11-06
  • 打赏
  • 举报
回复
引用 1 楼 taiguang 的回复:
select DP.Seq_Issue_Policy_Veh.nextval FROM dual; select DP.Seq_Issue_Policy_Veh.nextval FROM dual; 你只需要执行以上两句就可以看出来了,不是sequence 错了,是你用错了
关键我分别是两个序列啊 Seq_Issue_Policy_Veh和Seq_Issue_Policy_NONVeh
软件钢琴师 2012-11-06
  • 打赏
  • 举报
回复
select DP.Seq_Issue_Policy_Veh.nextval FROM dual; select DP.Seq_Issue_Policy_Veh.nextval FROM dual; 你只需要执行以上两句就可以看出来了,不是sequence 错了,是你用错了
mg_chen 2012-11-06
  • 打赏
  • 举报
回复
RAC服务器,进程都可能影响到SEQ 因为有Cache参数的存在,故SEQ完全可能出现不连续的现象 如果需要连续的数值,应将cache设置为0,但是这样效率很低

3,496

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧