Oracle数据库分批次向A表中插入B表中数据

  1. 业务简介:A表是B表的明细表,现需求是B表有上百万记录,在A表中插入B表的相关记录。
  2. 准备工作:oracle数据库,数据库工具pl\sql,存储过程写在包中。
  3. 实现思路:
    3.1 获取B表总数据量V_CU_COUNT,设置一次提交量V_SIZE为5000,计算出总页数V_PAGE := CEIL(V_CU_COUNT / V_SIZE);,起始索引V_INDEX为1;
    3.2 每5000条数据提交一次,索引值加1,循环提交;

  4. 存储过程

PROCEDURE INIT_CU_ENJOY(O_ERROR_CODE OUT VARCHAR2
                           ,O_ERROR_TEXT OUT VARCHAR2) IS
        V_CU_COUNT NUMBER;
        V_SIZE     NUMBER;
        V_PAGE     NUMBER;
        V_INDEX    NUMBER;
        V_EXCEPTION EXCEPTION;
    BEGIN
        V_INDEX := 1;
        V_SIZE  := 5000;
        SELECT COUNT(1)
        INTO   V_CU_COUNT
        FROM   CU_CUSTOMER CC
        WHERE  CC.CUSTOMER_ACC_ENJOY > 0;
        V_PAGE := CEIL(V_CU_COUNT / V_SIZE);

        BEGIN

            LOOP
                IF V_INDEX <= V_PAGE THEN
                    INSERT INTO CU_ENJOY
                        (ENJOY_ID
                        ,ENJOY_CUSTOMER
                        ,ENJOY_CATEGORY
                        ,ENJOY_AMT
                        ,ENJOY_BALANCE
                        ,ENJOY_ABSTRACT
                        ,ENJOY_REMARK)
                        SELECT SEQ_CU_ENJOY.NEXTVAL ENJOY_ID
                              ,ENJOY_CUSTOMER
                              ,ENJOY_CATEGORY
                              ,ENJOY_AMT
                              ,ENJOY_BALANCE
                              ,ENJOY_ABSTRACT
                              ,ENJOY_REMARK
                        FROM   (SELECT ROWNUM RN
                                      ,CC.CUSTOMER_ID ENJOY_CUSTOMER
                                      ,4 ENJOY_CATEGORY
                                      ,CC.CUSTOMER_ACC_ENJOY ENJOY_AMT
                                      ,CC.CUSTOMER_ACC_ENJOY ENJOY_BALANCE
                                      ,'摘要' ENJOY_ABSTRACT
                                      ,'备注' ENJOY_REMARK
                                FROM   CU_CUSTOMER CC
                                WHERE  CC.CUSTOMER_ACC_ENJOY > 0
                                AND    ROWNUM <= V_INDEX * V_SIZE)
                        WHERE  RN >= (V_INDEX - 1) * V_SIZE + 1;

                    V_INDEX := V_INDEX + 1;
                    COMMIT;
                ELSE
                    RETURN;
                END IF;
            END LOOP;

        END;

    EXCEPTION
        WHEN V_EXCEPTION THEN
            PKG_SYS.SET_ERROR('INIT_CU_ENJOY'
                             ,'插入初始化数据错误'
                             ,O_ERROR_CODE
                             ,O_ERROR_TEXT);

            ROLLBACK;
        WHEN OTHERS THEN
            PKG_SYS.SET_ERROR('INIT_CU_ENJOY'
                             ,'插入初始化数据错误'
                             ,O_ERROR_CODE
                             ,O_ERROR_TEXT);

            ROLLBACK;
    END INIT_CU_ENJOY;
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!对于Oracle数据库UNDOTBS空间不断增大的问题,有几个可能的原因和解决方法。 1. 长时间运行的事务:如果有长时间运行的事务,它们可能会占用大量的UNDOTBS空间。你可以通过查询v$transaction视图来检查当前活动的事务,并尝试终止或优化这些事务,以释放空间。 2. 回滚段保留时间过长:回滚段在事务回滚或撤销时使用UNDOTBS空间。如果回滚段保留时间设置过长,UNDOTBS空间会不断增大。你可以通过修改回滚段保留时间的参数(UNDO_RETENTION)来控制UNDOTBS空间的增长。 3. 高并发环境:在高并发环境下,频繁的并发事务可能会导致UNDOTBS空间增长迅速。你可以考虑增加UNDOTBS空间的大小,以适应更多的并发事务。 4.未提交事务或长时间未提交事务:未提交的事务会一直占用UNDOTBS空间,直到它们被提交或回滚。确保所有事务都能及时提交或回滚,以避免UNDOTBS空间持续增长。 5. 导致大量回滚数据的操作:某些操作可能导致产生大量的回滚数据,例如大批量的数据插入、更新或删除操作。你可以考虑将这些操作拆分成更小的批次,以减少对UNDOTBS空间的需求。 请注意,在进行任何更改之前,务必备份数据库以防止数据丢失。此外,如果你不确定如何处理UNDOTBS空间的增长问题,建议咨询有经验的数据库管理员。希望这些信息对你有所帮助!如果你还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值