zoukankan      html  css  js  c++  java
  • insert all 遇到 sequence

    当insert all 遇到 sequence
    这几天在修改商函2.0中相关的PL/SQL包代码时,在实现这样一个SQL时:
    insert all into bo(object_name,sn) values(object_name,seqkey)
                    into co(object_name,sn)  values(object_name,seqkey)
    select object_name ,sq1.nextval from ao

    ORACLE ORA-02287错,原因是INSERT ALL 需要插入多表,但SELECT部分的SEQUENCE不允许一次SELECT多值,解决方案有两个:
    方法一:编一个函数,将获取sq1.nextval的过程写在函数中,再在select 部分引用函数,如下:
    create or replace function f_getseqkey return number is
    result number;
    begin
    select sq1.nextval into result from dual ;
    return result ;
    end;

    SQL:insert all into bo(object_name,sn) values(object_name,seqkey)
                            into co(object_name,sn) values(object_name,seqkey-1)
    select object_name ,f_getseqkey() seqkey from ao;

    说明:这里有个-1的行为,研究发现,在插入多表时,实际上后面的SELECT是有做两次NEXTVAL行为的,而为了确保两个INTO插入同样的序列值,则人为进行-1插作,这个方案的后果是会多用序列值,在插入更多表的情况下,可能造成应用键值紧张,另外额外调用函数,性能也会下降。
    方法二:
    SQLinsert all into bo(object_name,sn) values(object_name,sq1.nextval)
                              into co(object_name,sn) values(object_name,sq1.nextval)
              select object_name from ao

    这个方法最好,无需定义函数,也不多用序列,性能也好,
    现象:在两个INTO中都使用了NEXTVAL,但能确保是相同的值吗?答案是OK,因为INSERT ALL 到多表,在ORACLE看来是同一SQL,即类同:SELECT SEQ.NEXTVAL,SEQ.NEXTVAL FROM DUAL这样的SQL,同一SQL中多次调用同一序列,值相同。但如果在同一SQL中多次调用这个自定义函数,则会获得不同的值。
  • 相关阅读:
    "rm f xxx"不起作用? 还是需要确认删除?
    (转)C# 3.0语言的新特性——Lambda表达式
    (转)依赖注入的思想(目前见过最好的对DI的描述)
    #import、#include、#import<>和#import””的区别
    Cocoa设计模式之委托
    详解MAC硬盘中各个文件夹
    Cocoa设计模式之单例
    ObjecticeC之关联对象
    UDID被禁用后的集中替代品
    Cocoa设计模式之KVO
  • 原文地址:https://www.cnblogs.com/jimeper/p/1493829.html
Copyright © 2011-2022 走看看