zoukankan      html  css  js  c++  java
  • g_vouchernosuppl 表几千万条数据的问题

    runcate gl_vouchermaxno;--删除最大号表数据(不写回滚段)
    truncate gl_vouchernosuppl;--删除补号表数据(不写回滚段)
    delete from gl_vouchermaxno;--删除最大号表数据
    delete from gl_vouchernosuppl;--删除补号表数据
    --注:如果确定要删除数据的话,删除大量数据用truncate速度很快,但有个缺点是不写回滚段,不能回滚,慎重选择。用delete的方式删除数据,写回滚段,大量数据删除的时候速度很慢。
    /*以下语句根据凭证表数据重新插入凭证最大号*/
    insert into gl_vouchermaxno
      (select 0,
              max(no),
              a.period,
              a.pk_glorgbook,
              max(a.pk_voucher),
              a.pk_vouchertype,
              max(ts),
              a.year
         from gl_voucher a
        where a.dr = 0
          and (a.year || a.period >
              (select s.settledyear || s.settledperiod
                  from gl_syssettled s
                 where s.pk_glorgbook = a.pk_glorgbook) or
              (not exists (select s.settledyear || s.settledperiod
                              from gl_syssettled s
                             where s.pk_glorgbook = a.pk_glorgbook
                 and s.settledyear is not null
                 and s.settledperiod is not null)))
        group by a.pk_glorgbook, a.year, a.period, a.pk_vouchertype);
    /*创建一个序列,插补号表数据时用*/
    create sequence sttt start with 100000000000000;
    /*以下语句根据最大号表和凭证表数据查出空号,并将其插入到补号表*/
    DECLARE
      v_orgbook VARCHAR2(20);
      v_year char(4);
      v_period char(2);
      v_vouchertype char(20);
      CURSOR v_cursor IS
            SELECT pk_glorgbook,year,period,pk_vouchertype FROM gl_vouchermaxno;
      v_row v_cursor%ROWTYPE;
      BEGIN
         OPEN v_cursor;
       Loop
       
        FETCH v_cursor INTO v_row;
        v_orgbook := v_row.pk_glorgbook;
        v_year := v_row.year;
        v_period :=v_row.period;
        v_vouchertype := v_row.pk_vouchertype;
        
        INSERT INTO gl_vouchernosuppl
         SELECT 2, b.NO,
              (SELECT pk_vouchermaxno
                 FROM gl_vouchermaxno
                WHERE pk_glorgbook = v_orgbook
                AND YEAR = v_year
                  AND period = v_period
                  AND pk_vouchertype = v_vouchertype),
              substr(b.pk_glorgbook,16,20) || sttt.NEXTVAL, ts
         FROM (SELECT a.n AS NO, ts, voucher.pk_voucher,a.pk_glorgbook, nosuppl.pk_vouchermaxno
                 FROM (SELECT ROWNUM AS n, ts AS ts, v_orgbook as pk_glorgbook
                         FROM gl_voucher
                        WHERE ROWNUM <=
                                 (SELECT maxno
                                    FROM gl_vouchermaxno
                                   WHERE pk_glorgbook = v_orgbook
                                     AND YEAR = v_year
                                     AND period = v_period
                                     AND pk_vouchertype = v_vouchertype) and gl_voucher.dr=0) a
                      LEFT OUTER JOIN
                      (SELECT pk_voucher, NO
                         FROM gl_voucher
                        WHERE gl_voucher.pk_glorgbook = v_orgbook
                          AND gl_voucher.YEAR = v_year
                          AND gl_voucher.period = v_period
                          AND gl_voucher.pk_vouchertype = v_vouchertype
                          AND gl_voucher.dr = 0) voucher ON voucher.NO = a.n
                      LEFT OUTER JOIN
                      (SELECT NO, pk_vouchermaxno
                         FROM gl_vouchernosuppl
                        WHERE gl_vouchernosuppl.pk_vouchermaxno =
                                 (SELECT pk_vouchermaxno
                                    FROM gl_vouchermaxno
                                   WHERE pk_glorgbook = v_orgbook
                                     AND YEAR = v_year
                                     AND period = v_period
                                     AND pk_vouchertype = v_vouchertype)) nosuppl
                      ON a.n = nosuppl.NO
                      ) b
        WHERE b.pk_voucher IS NULL AND pk_vouchermaxno IS NULL;
        EXIT WHEN v_cursor%NOTFOUND;
        
        end Loop;
        close v_cursor;
        end;
     /*删除序列*/
        drop sequence sttt      
  • 相关阅读:
    【BZOJ1495】[NOI2006]网络收费 暴力+DP
    【BZOJ2827】千山鸟飞绝 hash+堆+SBT
    【BZOJ2905】背单词 fail树+DFS序+线段树
    【BZOJ3120】Line 矩阵乘法
    【BZOJ1441】Min 拓展裴蜀定理
    【BZOJ3195】[Jxoi2012]奇怪的道路 状压DP
    【BZOJ3416】Poi2013 Take-out 栈
    【BZOJ4244】邮戳拉力赛 DP
    【BZOJ3717】[PA2014]Pakowanie 状压DP
    【BZOJ1217】[HNOI2003]消防局的设立 树形DP
  • 原文地址:https://www.cnblogs.com/sumsen/p/2525365.html
Copyright © 2011-2022 走看看