首页 > 数据库 >oracle 批处理,bulk collect

oracle 批处理,bulk collect

时间:2024-09-23 15:34:24浏览次数:1  
标签:collect -- CREATE bulk column TBL oracle TABLE 100

这是一个示例,问了文心一言,给出的答复,最简单的demo

 

BEGIN
  -- 禁用日志
  EXECUTE IMMEDIATE 'ALTER SYSTEM SET events=''10046 trace name context off''';
 
  -- 执行你的批处理操作,比如插入或更新
  INSERT INTO your_table (column1, column2) VALUES (value1, value2);
  -- 或者
  UPDATE your_table SET column1 = value1 WHERE condition;
 
  -- 重新启用日志
  EXECUTE IMMEDIATE 'ALTER SYSTEM SET events=''10046 trace name context level 4''';
END;
/    



CREATE TABLE TBL_A (  
    column_1 VARCHAR2(100),  
    column_2 NUMBER,  
    column_3 DATE  
);  
  
CREATE TABLE TBL_B (  
    ID NUMBER PRIMARY KEY,  
    column_1 VARCHAR2(100),  
    column_2 NUMBER,  
    column_3 DATE  
);  
  
CREATE SEQUENCE SEQ_B START WITH 1 INCREMENT BY 1;


CREATE OR REPLACE PROCEDURE BULK_INSERT_FROM_A_TO_B IS  
    -- 定义用于批量收集的表类型  
    TYPE t_tbl_a_rows IS TABLE OF TBL_A%ROWTYPE INDEX BY PLS_INTEGER;  
    V_SOURCE_ROWS t_tbl_a_rows;  
      
    -- 定义一个用于存储TBL_B新ID的数组  
    TYPE t_ids IS TABLE OF TBL_B.ID%TYPE INDEX BY PLS_INTEGER;  
    v_ids t_ids;  
      
    -- 假设我们一次处理100条记录  
    v_limit CONSTANT PLS_INTEGER := 100;  
BEGIN  
    -- 使用BULK COLLECT批量从TBL_A中获取数据  
    SELECT * BULK COLLECT INTO V_SOURCE_ROWS FROM TBL_A WHERE ROWNUM <= v_limit;  
      
    -- 为每个记录分配ID  
    FOR i IN 1 .. V_SOURCE_ROWS.COUNT LOOP  
        v_ids(i) := SEQ_B.NEXTVAL;  
    END LOOP;  
      
    -- 批量插入到TBL_B  
    FORALL i IN 1 .. V_SOURCE_ROWS.COUNT  
        INSERT INTO TBL_B (ID, column_1, column_2, column_3)  
        VALUES (v_ids(i), V_SOURCE_ROWS(i).column_1, V_SOURCE_ROWS(i).column_2, V_SOURCE_ROWS(i).column_3);  
      
    -- 提交事务  
    COMMIT;  
      
    -- 可选:处理异常  
    EXCEPTION  
        WHEN OTHERS THEN  
            -- 回滚事务  
            ROLLBACK;  
            -- 抛出异常  
            RAISE;  
END BULK_INSERT_FROM_A_TO_B;  
/




CREATE OR REPLACE PROCEDURE BULK_INSERT_BY_YEAR IS  
    -- 定义记录类型以匹配TBL_A表的行  
    TYPE t_tbl_a_row IS RECORD (  
        column_1 VARCHAR2(100),  
        column_2 NUMBER,  
        month_num VARCHAR2(6)  
    );  
      
    -- 定义表类型以存储多个行  
    TYPE t_tbl_a_rows IS TABLE OF t_tbl_a_row INDEX BY PLS_INTEGER;  
    V_SOURCE_ROWS t_tbl_a_rows;  
      
    -- 遍历年份的游标  
    CURSOR c_years IS  
        SELECT DISTINCT SUBSTR(month, 1, 4) AS year  
        FROM TBL_A  
        ORDER BY year;  
      
    v_year TBL_A.month%TYPE;  
    v_sql_stmt VARCHAR2(4000);  
    v_id TBL_B_2023.ID%TYPE; -- 假设TBL_B_2023表有ID列,其他年份表类似  
BEGIN  
    -- 获取所有唯一的年份  
    OPEN c_years;  
    LOOP  
        FETCH c_years INTO v_year;  
        EXIT WHEN c_years%NOTFOUND;  
          
        -- 使用BULK COLLECT按年份收集数据  
        EXECUTE IMMEDIATE 'SELECT column_1, column_2, month FROM TBL_A WHERE SUBSTR(month, 1, 4) = :1'  
        BULK COLLECT INTO V_SOURCE_ROWS  
        USING v_year;  
          
        -- 为简化示例,假设所有表结构相同,且都有ID列作为主键  
        -- 实际情况中,您可能需要为每个表单独定义序列  
          
        -- 批量插入到对应的年份表  
        FOR i IN 1 .. V_SOURCE_ROWS.COUNT LOOP  
            -- 生成ID(这里简化为直接使用序列,但注意可能需要为每个年份表单独维护序列)  
            -- 假设所有年份表共享同一个序列SEQ_B,或者您有更复杂的逻辑来分配ID  
            v_id := SEQ_B.NEXTVAL;  
              
            -- 构建动态SQL语句以插入数据  
            v_sql_stmt := 'INSERT INTO TBL_B_' || v_year || ' (ID, column_1, column_2, month) VALUES (:1, :2, :3, :4)';  
              
            -- 执行动态SQL语句  
            EXECUTE IMMEDIATE v_sql_stmt  
            USING v_id, V_SOURCE_ROWS(i).column_1, V_SOURCE_ROWS(i).column_2, V_SOURCE_ROWS(i).month;  
        END LOOP;  
          
        -- 清除集合以准备下一次循环  
        V_SOURCE_ROWS.DELETE;  
    END LOOP;  
    CLOSE c_years;  
      
    -- 提交事务  
    COMMIT;  
      
    -- 异常处理(略)  
EXCEPTION  
    WHEN OTHERS THEN  
        -- 回滚事务  
        ROLLBACK;  
        -- 抛出异常或记录错误(这里只是简单回滚)  
        RAISE;  
END BULK_INSERT_BY_YEAR;  
/

 

标签:collect,--,CREATE,bulk,column,TBL,oracle,TABLE,100
From: https://www.cnblogs.com/tomcatandjerry/p/18427155

相关文章

  • Oracle监听连接速度很慢且不稳定问题排查与解决
    1.本机数据库启动和关闭正常sqlplus/assysdbastartupshutdownimmediate2.Oracle监听启动时需要几分钟并且大概率启动失败(监听服务启动也很慢)lsnrctlstart3.查询监听状态也需要几分钟才能出结果lsnrctlstatus应用程序或Oracle客户端(PL/SQL等)连接时好时坏,并且连接很慢(连接上之......
  • PARTIII-Oracle事务管理-事务
    10.事务10.1.事务简介10.1.1.示例事务:账户借记和贷记10.1.2.事务的结构10.1.3.语句级原子性10.1.4.系统变更号(SCNs)10.2.事务控制概述10.2.1.事务名称10.2.2.活跃事务10.2.3.保存点10.2.4.事务回滚10.2.5.事务提交10.3.自治事务10.4.分布式事务10.4.1.......
  • Oracle数据库高级技术解析与实战案例
    Oracle数据库高级技术解析与实战案例引言Oracle数据库作为企业级数据库市场的领导者,凭借其强大的数据处理能力、高可用性、可扩展性以及安全性,在各行各业得到了广泛应用。本文将深入探讨Oracle数据库的高级技术特性,并通过实际代码案例展示其在复杂业务场景中的应用。无论......
  • Oracle2PG sequence(序列)问题汇总
    迁移PostgreSQL的Sequence(序列)问题https://masuit.net/2042?t=0HN6FQRQT1K6P如何快速获取同步序列的SQL有些项目中数据量比较少,在迁移过程;表数据迁移过去;但是序列需要重置下;接下来讲到,引用自:https://www.cnblogs.com/lottu/p/14330474.htmlSELECTconcat('SELECTsetval(''"',......
  • WPF Unable to cast object of type 'System.Windows.Controls.SelectedItemCollectio
    SelectedItemsconverttoIListasbelowfailed;IList<Book>collection2=(IList<Book>)obj; System.InvalidCastExceptionHResult=0x80004002Message=Unabletocastobjectoftype'System.Windows.Controls.SelectedItemCollection'......
  • 图文深入理解Oracle DB实例管理
    本来这篇打算承接上篇,接着介绍Oracle数据库表的管理的,但考虑到需要实操,在这之前先深入介绍下OracleDB实例的基本管理,包括一些常用的管理工具和数据库启动过程的各个阶段和几种带选项的关闭方式的会有什么影响。学习知识就得循序渐进,每个知识点揉碎了再彻底消化。一。Oracl......
  • JAVA集合——Collection接口
    目录1.Collection接口1.概述2.常见方法a.对象添加到集合中b.清空集合中所有的元素c.把给定的对象在当前集合中删除d.判断是否包含 e.判断集合是否为空f.返回集合元素中集合个数​编辑3.Collection的遍历方式a.迭代器遍历1.获取迭代器2.迭代器中常见的方法a.......
  • oracle 事务的管理
    事务的特性事务是由一组SQL语句组成的逻辑工作单元,这些语句要么全部执行,要么不执行,只要有一条SQL语句执行失败,则已执行的SQL语句会回滚到执行之前的状态,这样就保证了数据库数据的一致性,不产生混乱的数据信息。通过事务,可以实现数据的共享,事务可以保证数据的一致性。只有CO......
  • oracle常用后台进程及sql语句执行流程
    1.checkpoint功能:减少崩溃恢复crashrecovery时间。检查点可以确保在某个时间点之前的所有事务都写入磁盘,保证数据一致性后台进程ckpt触发,ckpt通知dbwr进程将脏数据库dirtybuffer写出到数据文件上.更新数据文件头及控制文件上的检查点触发条件:数据库一致性关闭、altersystem......
  • 高效数据移动指南 | 如何快速实现数据库 Oracle 到 Dameng 的数据同步?
    在现代企业中,数据无处不在,贯穿于各个业务环节和系统之间。无论是跨系统的数据集成、多地域的数据协同,还是实时应用的数据同步,数据的一致性和及时性都至关重要。在数字化转型的过程中,如何确保不同系统、地域、设备之间的数据同步,成为了企业面临的重要挑战。本专题将基于实践经验,从......