`
cutesunshineriver
  • 浏览: 201207 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Fetch Bulk Collect Into

阅读更多
create or replace procedure Unique_Record_In_Zhk(partition_name in varchar2) is
--变量声明
TYPE dynamic_cur IS REF CURSOR;
cur dynamic_cur;--动态游标
select_sql varchar2(200);
V_rowid varchar2(50);
rowid_tmp varchar2(50);
counts number := 0;
id varchar2(190);
id_tmp varchar2(190);
TYPE TAB_ID IS TABLE OF t_zhk.ID%TYPE;
TYPE TAB_ROWID IS TABLE OF rowid;
id_type TAB_ID;
rowid_type TAB_ROWID;
--结束变量声明
begin
  select_sql := ('select id, rowid from ' || partition_name || ' order by id');
  open cur for select_sql;
  
  LOOP
    /* 当用FETCH已经取到游标的末尾时,再对游标进行取值,游标会返回结果集中的最后一条记录,
     * 因为,当游标再结果集中取不到值时会返回给用户游标缓冲区的内容(也就是结果集中的最后一条记录)*/
    FETCH cur BULK COLLECT INTO id_type, rowid_type limit 100000;
    
    for id_index in 1 .. id_type.COUNT
      LOOP
      id := id_type(id_index);
      V_rowid := rowid_type(id_index);
      if (id_tmp is not null) then 
         begin
            if (id = id_tmp) then 
              execute immediate 'delete from ' || partition_name || ' where rowid = :rowid_tmp' using rowid_tmp;
              counts := counts + 1;
            end if;
         end;
      end if;
      
      id_tmp := id;
      rowid_tmp := V_rowid;
      if (mod(counts,2000) = 0) then
        commit;
      end if;
      END LOOP;
    
    EXIT WHEN cur%NOTFOUND;
  end LOOP;
  
  close cur;
  commit;
  dbms_output.put_line(to_char(counts));
  
end Unique_Record_In_Zhk;


将分区名作为参数传入存储过程,生成动态游标,以10万为一个批次进行批量提取数据。数据按ID做了排序,删除重复的ID记录,保留一条即可。删除记录的时候使用了变量替换,每删除2000条记录提交一次事务。
分享到:
评论

相关推荐

    Oracle 中使用 fetch bulk collect into 批量效率的读取游标数据

    Oracle 中使用 fetch bulk collect into 批量效率的读取游标数据 Oracle 中的游标数据读取是数据库开发中非常常见的操作。通常,我们使用 fetch some_cursor into var1, var2 形式来获取游标数据,当游标中的记录数...

    sal,ename BULK COLLECT INTO

    ### "sal,ename BULK COLLECT INTO" 相关知识点详解 #### 一、知识点概述 在提供的代码片段中,“sal,ename BULK COLLECT INTO”这一表述并未直接出现在代码中,但从整体上下文来看,这里主要涉及的是Oracle数据库...

    oracle批量处理(bulk collect)

    - **FETCH INTO**:结合游标使用`BULK COLLECT`一次性获取多行数据。 - **RETURNING INTO**:在`DELETE`或`UPDATE`语句后,使用`BULK COLLECT`来获取受影响行的信息。 #### 四、示例 ##### 1. 在SELECT INTO语句中...

    bulk collect学习

    在 Oracle8i 中引入的 Bulk Collect 特性,适用于 select into、fetch into 和 returning into 语句。例如: 1. **在 select into 语句中使用 bulk collect**: 在这个示例中,我们创建了一个名为 SalList 的表...

    plsql编程之葵发宝典.txt

    FETCH cur_ic01 BULK COLLECT INTO l_nt_ic01; CLOSE cur_ic01; DBMS_OUTPUT.PUT_LINE('COUNT: ' || l_nt_ic01.COUNT); END; / ``` **输出结果** ``` COUNT: 9 ``` ##### 2. RETURNING INTO 除了传统的SELECT...

    oracle下巧用bulk collect实现cursor批量fetch的sql语句

    接着,使用 `bulk collect into` 语句从Cursor中一次性获取多行数据,并分别存入 `v_code` 和 `v_name` 集合中。最后,通过循环遍历集合并打印出数据。 更简洁的方法是,我们可以定义一个包含整个记录类型的集合,...

    浅谈PL/SQL批处理语句:BULK COLLECT与FORALL对优化做出的贡献

    2. **在FETCH INTO语句中使用BULK COLLECT**: 同样,我们也可以在打开游标后,使用BULK COLLECT一次性获取多行记录。如下所示: ```sql DECLARE TYPE deptrectab IS TABLE OF departments%ROWTYPE; dept_recs ...

    Oracle BULK COLLECT批量取数据解决方法

    然后,使用 `FETCH` 语句配合 `BULK COLLECT INTO` 将游标中的多行数据批量加载到 `v_pg3_table` 集合中。这里的 `BULK COLLECT` 关键字是关键所在,它指示PL/SQL引擎一次处理多行,而不是一行一行地处理。 之后,...

    Oracle 遍历游标的四种方式汇总(for、fetch、while、BULK COLLECT)

    BULK COLLECT INTO COLLECTION_FIRST_INDEX FROM INDEX_A A ORDER BY A_ID; FORALL i IN 1..COLLECTION_FIRST_INDEX.COUNT DBMS_OUTPUT.PUT_LINE('{"ID":"' || COLLECTION_FIRST_INDEX(i).A_ID || '","名称":...

    Oracle复习例题

    以上内容展示了Oracle数据库中游标的基本用法和高级特性,包括标准的FETCH INTO、BULK COLLECT INTO、记录类型变量、参数游标、游标FOR循环以及存储过程的创建。这些知识点对于理解Oracle数据库的复杂查询和数据处理...

    游标分批取数据例子

    默认情况下,`FETCH`语句会读取一行数据,但在高级用法中,我们可以结合`BULK COLLECT INTO`语句和`LIMIT`子句,一次读取多行数据,即实现分批读取。 ### 分批取数据示例解析 下面,我们通过分析给定的部分内容,...

    批处理 动态sql

    批处理在Oracle数据库中主要体现在BULK COLLECT INTO语句中,它可以将查询结果批量收集到一个集合变量中,而不是一条一条地处理。在给定的代码示例中,首先通过DECLARE声明了两个游标类型ref_cursor_type和两个嵌套...

    Oracle 批查询

    bulk collect在 select ... into、fetch ... into、returning ... into中的应用。

    oracle游标使用及实例

    FETCH cur_name BULK COLLECT INTO var_rowid, v_col2 LIMIT 1000; FOR ALL i IN var_rowid.FIRST .. var_rowid.LAST -- 执行SQL语句 COMMIT; EXIT WHEN cur_name%NOTFOUND; END LOOP; ``` 2. **退出...

    oracle 迅速查询和更新大数据

    fetch c_bulk bulk collect into ref_bulk limit 250000; -- 执行批量插入操作 forall i in 1..ref_bulk.count insert into emp_table_his values ref_bulk(i); commit; exit when c_bulk%notfound; end loop...

    oracle 游 标 使 用

    FETCH cur_tsalary BULK COLLECT INTO all_rec_tsalary LIMIT 5; FOR i IN 1..all_rec_tsalary.COUNT LOOP DBMS_OUTPUT.PUT_LINE(all_rec_tsalary(i).employeeid || all_rec_tsalary(i).positionid); END LOOP; ...

    JAVA 与 Sql学习笔记

    BULK COLLECT INTO collection_name FROM table_name; ``` 5. **LIMIT子句**: 使用LIMIT子句可以在BULK COLLECT中限制批量操作的大小,防止一次性处理过多数据导致资源消耗过大。 6. **RETURNING INTO子句**...

    oracle 批量

    SELECT * BULK COLLECT INTO bulk_table FROM TBL_NAME WHERE condition; FORALL i IN 1..bulk_table.COUNT DELETE FROM TBL_NAME WHERE CURRENT OF bulk_table(i); END; / ``` 二、注意事项 1. **事务管理*...

Global site tag (gtag.js) - Google Analytics