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中多次调用这个自定义函数,则会获得不同的值。
  • 相关阅读:
    js指定区域全屏
    sql中对日期的筛选
    SQL Server查询死锁,杀死进程解决死锁
    SqlServer数据类型、C#SqlDbType对应关系及转换
    用SqlDataReader返回多个结果集
    SQL重复记录查询的几种方法
    IIS支持10万个同时请求的设置
    常量与变量的命名法则
    远程服务器返回错误: (405) 不允许的方法。
    The view 'Index' or its master was not found or no view engine supports the
  • 原文地址:https://www.cnblogs.com/jimeper/p/1493829.html
Copyright © 2011-2022 走看看