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 some_cursor into var1, var2 形式来获取游标数据,当游标中的记录数...
### "sal,ename BULK COLLECT INTO" 相关知识点详解 #### 一、知识点概述 在提供的代码片段中,“sal,ename BULK COLLECT INTO”这一表述并未直接出现在代码中,但从整体上下文来看,这里主要涉及的是Oracle数据库...
- **FETCH INTO**:结合游标使用`BULK COLLECT`一次性获取多行数据。 - **RETURNING INTO**:在`DELETE`或`UPDATE`语句后,使用`BULK COLLECT`来获取受影响行的信息。 #### 四、示例 ##### 1. 在SELECT INTO语句中...
在 Oracle8i 中引入的 Bulk Collect 特性,适用于 select into、fetch into 和 returning into 语句。例如: 1. **在 select into 语句中使用 bulk collect**: 在这个示例中,我们创建了一个名为 SalList 的表...
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...
接着,使用 `bulk collect into` 语句从Cursor中一次性获取多行数据,并分别存入 `v_code` 和 `v_name` 集合中。最后,通过循环遍历集合并打印出数据。 更简洁的方法是,我们可以定义一个包含整个记录类型的集合,...
2. **在FETCH INTO语句中使用BULK COLLECT**: 同样,我们也可以在打开游标后,使用BULK COLLECT一次性获取多行记录。如下所示: ```sql DECLARE TYPE deptrectab IS TABLE OF departments%ROWTYPE; dept_recs ...
然后,使用 `FETCH` 语句配合 `BULK COLLECT INTO` 将游标中的多行数据批量加载到 `v_pg3_table` 集合中。这里的 `BULK COLLECT` 关键字是关键所在,它指示PL/SQL引擎一次处理多行,而不是一行一行地处理。 之后,...
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数据库中游标的基本用法和高级特性,包括标准的FETCH INTO、BULK COLLECT INTO、记录类型变量、参数游标、游标FOR循环以及存储过程的创建。这些知识点对于理解Oracle数据库的复杂查询和数据处理...
默认情况下,`FETCH`语句会读取一行数据,但在高级用法中,我们可以结合`BULK COLLECT INTO`语句和`LIMIT`子句,一次读取多行数据,即实现分批读取。 ### 分批取数据示例解析 下面,我们通过分析给定的部分内容,...
批处理在Oracle数据库中主要体现在BULK COLLECT INTO语句中,它可以将查询结果批量收集到一个集合变量中,而不是一条一条地处理。在给定的代码示例中,首先通过DECLARE声明了两个游标类型ref_cursor_type和两个嵌套...
bulk collect在 select ... into、fetch ... into、returning ... into中的应用。
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. **退出...
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...
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; ...
BULK COLLECT INTO collection_name FROM table_name; ``` 5. **LIMIT子句**: 使用LIMIT子句可以在BULK COLLECT中限制批量操作的大小,防止一次性处理过多数据导致资源消耗过大。 6. **RETURNING INTO子句**...
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. **事务管理*...