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