当前位置:  数据库>oracle

使用序列的错误ORA-02287

    来源: 互联网  发布时间:2017-06-16

    本文导语: 今天一个开发的同事问我一个问题,说在执行一条sql语句的时候报了ORA错误,脑海中删除了各种权限的问题之后,他提供给我的错误还是在我预料之外。ERROR at line 1: ORA-02287: sequence number not allowed here 这个问题看错误信息是很明...

今天一个开发的同事问我一个问题,说在执行一条sql语句的时候报了ORA错误,脑海中删除了各种权限的问题之后,他提供给我的错误还是在我预料之外。
ERROR at line 1:
 ORA-02287: sequence number not allowed here

这个问题看错误信息是很明显和sequence有关的。但是为什么会报出这个错误呢,在几封邮件交流之后,问题就明朗起来,语句是类似下面这样的结构,insert into customer(xxxxx,xxxxx,xxx...............)
 select distinct xxxxx,seq_value.nextval,xxxx,xxxx,xxx... from new_table group by xxx,xxx,xxx,xxx;
真实的脚本洋洋洒洒一大页,各种子查询,表关联,函数处理,看起来还是需要些耐心的。简缩之后就是上面的结构,
 这个Insert采用了子查询来插入数据,根据和开发的沟通,是需要提供一个补丁,做修复数据所用,所以会有大量的数据过滤操作。
 插入数据的时候使用seq_value.nextval也还是很常见的,怎么会报出错误了呢,按照这个语句的结构发现还是最开头的distinct和group操作导致的,这种数据的统计分析操作让本来就不确定的sequence值更加不确定,所以斟酌再三还是建议他们先创建一个临时表,不涉及序列的操作,只对序列之外的数据通过distinct,group by过滤之后,在insert的时候对刚创建的临时表和序列结合起来,一次插入。

伪代码类似下面的形式,
create table temp_tab as select distinct xxxxxx  from xxxx  group by xxxxxx;
 insert into customer(xxxxx,xxxx) select xxxx,seq_vvalue.nextval from temp_tab;

我们来简答模拟一下这个问题。
 首先为了不影响原有的sequence,我们可以创建一个类似的sequence,然后在脚本中替换即可,这样也不会对原有环境的sequence值造成影响。
CREATE SEQUENCE  "NEW_SEQ"  MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1012852 CACHE 20 NOORDER  NOCYCLE
然后我们创建一个表
create table new_test( id1 number,id2 number,name varchar2(30));
然后尝试distinct和group by 操作,发现都不可以。
n1@TEST11G> select new_seq.nextval,id1,id2,name from new_test group by id1,id2,name;
 select new_seq.nextval,id1,id2,name from new_test group by id1,id2,name
                *
 ERROR at line 1:
 ORA-02287: sequence number not allowed here

n1@TEST11G> select distinct new_seq.nextval,id1,id2,name from new_test;
 select distinct new_seq.nextval,id1,id2,name from new_test
                        *
 ERROR at line 1:
 ORA-02287: sequence number not allowed here
其实这个问题的原因还是很容易理解的,这种sequence值的动态不确定性,很容易出问题。其实不光使用distinct,group by 会有问题,很多相关的操作都是如此。
 比如union,union all
 select new_seq.nextval,id1,id2,name from new_test
 union all
 select new_seq.nextval,id1,id2,name from new_test

 minus操作。
select new_seq.nextval,id1,id2,name from new_test
 minus
 select new_seq.nextval,id1,id2,name from new_test

使用In子查询
select new_seq.nextval id1,id2,name from new_test  where id1 in (select new_seq.nextval from new_test )

 order by操作
select new_seq.nextval,id1,id2,name from new_test order by id2;

换个角度来看,对于这类问题,也可以使用临时表来处理,也可以使用pl/sql来处理,都能达到比较目的,另外一个角度来说,对于sequence的使用,大家一般都认为是取之不尽,用之不竭,感觉大量使用时应该的,在很多时候还是需要好好斟酌一下,有些补丁或者临时的处理是否一定需要使用到序列,序列资源也是很宝贵的资源,如果在测试脚本中做了大量的自增处理也是很大的浪费。


    
 
 

您可能感兴趣的文章:

  • java将类序列化并存储到mysql(使用hibernate)
  • 对象序列化--存储数据库的方法 序列化后 不能使用
  • 使用XmlSerializer序列化List对象成XML格式(list对象序列化)
  • Python过滤函数filter()使用自定义函数过滤序列实例
  • jquery序列化表单以及回调函数的使用示例
  • C语言使用普通循环方法和递归求斐波那契序列示例代码
  • Oracle中使用触发器(trigger)和序列(sequence)模拟实现自增列实例
  • java对象序列化与反序列化的默认格式和json格式使用示例
  • jquery序列化form表单使用ajax提交后处理返回的json数据
  • 不使用myeclipse注册机得到myeclipse注册码的方法(myeclipse序列号)
  • java教程之对象序列化使用基础示例详解
  • 使用Runtime.exec("calc.exe")时,编译 出现错误,看不懂这个错误,怎么回事?
  • asp.net错误捕获(错误处理)page_error事件使用方法
  • ubuntu 10.10出现极其诡异的情况,使用gcc编译没任何反应,可以继续输入,但是不提示任何错误;使用make编译效果一样;
  • linux下使用易飞ERP系统出现“报表数据库连接错误!!”是怎么回事
  • 用popen,不能使用fseek了?Segmentation fault错误
  • sybase 的C 接口dbrpcparam 使用错误。。。
  • 我的网卡正确的加载和使用了。但是有错误!请指教
  • 在配置了DNS并启动服务后,使用host命令察看主机,为什么会出现SERVFAIL的错误?
  • 使用iceblood的qmail安装包为什么有如下错误提示
  • **紧急求助:使用xmanager连接linux出现得错误*****
  • 使用SSH登录另一台主机时,提示如下错误?!
  • mini2440中使用函数atan2得到错误结果
  • 使用Virtual PC安装Red Hat Linux 9.0时显卡识别错误,如何改回来?
  • 在Solaris下,使用xalan对XML转换时,出现错误,怎么办?同样程序在Windows可正常运行。
  • vim中使用ctags时总是报E426错误。。
  • 使用arm-linux-gcc编译,出现compilation of header file requested错误
  • C++使用OCCI连Oracle10g的错误
  • 关于resin和iis整合后,在使用asp程序时提示500内部服务器错误
  • busybox中的gzip运行过程中出现page fault错误,并指出出错的指针,但是怎么使用gdb调试,找到指针对应的语句?
  • 使用2.6.25内核request_firmware函数加载firmware失败,错误-2(ENOENT)
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ I/O 成员 tellg():使用输入流读取流指针
  • 在测试memset函数的执行效率时,分为使用Cash和不使用Cash辆种方式,该如何控制是否使用缓存?
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 求ibm6000的中文使用手册 !从来没用过服务器,现在急需使用它,不知如何使用! 急!!!!!
  • Python不使用print而直接输出二进制字符串
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • Office 2010 Module模式下使用VBA Addressof
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • c#中SAPI使用总结——SpVoice的使用方法
  • tcmalloc内存泄露优化c++开源库下载,安装及使用介绍
  • 使用了QWidget的程序,如何使用后台程序启动它?
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • 共享内存一般是怎么使用的,是同消息队列配合使用么
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • Jsp可否使用带有GUI的JavaBean,如何使用?
  • c/c++预处理命令预#,##使用介绍
  • asp程序使用的access在Linux下如何使用!
  • 在div中使用css让文字底部对齐的方法
  • 新装的Linux使用root用户不能使用FTP?
  • Python namedtuple(命名元组)使用实例
  • LINUX下使用Eclipse,如何使用交叉编译器?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3