• 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中多次调用这个自定义函数,则会获得不同的值。
  • 相关阅读:
    k8s 中 nfs作为存储的三种方式
    k8s-ingress部署测试以及深入理解
    k8s全方位监控-prometheus-配置文件介绍以及基于文件服务发现
    k8s全方位监控 -prometheus实现短信告警接口编写(python)
    prometheus-数据展示之grafana部署和数据源配置
    k8s全方位监控-prometheus-alertmanager部署-配置第一条告警邮件
    k8s全方位监控-prometheus部署
    k8s-coredns 介绍和部署
    k8s-静态PV和动态PV
    消息扩散
  • 原文地址:https://www.cnblogs.com/jimeper/p/1493829.html
Copyright © 2020-2023  润新知