- 论坛徽章:
- 0
|
供参考,批量删除数据
说明:
1 存储过程里绑定变量只能用动态sql 参考例1
2 在CURSOR里可以使用变量; 参考例3
例1
create or replace procedure mouse_update_numservice
is
type ridArray is table of rowid index by binary_integer;
v_rowid ridArray;
exec_sql varchar2(200);
begin
select a.rowid bulk collect into v_rowid
from numservice a, mouse_subscriberkey b
where a.subscriberkey=b.subscriberkey
and SUBSCRIBERCBP=521
and rownum < 1000001;
exec_sql := 'update numservice set SUBSCRIBERCBP=527 where rowid= ';
forall i in 1 .. v_rowid.COUNT
execute immediate exec_sql using v_rowid(i);
commit;
dbms_output.put_line('update rows: '||v_rowid.COUNT);
end;
/
例2
create or replace procedure mouse_update_numservice_nobind
is
type ridArray is table of rowid index by binary_integer;
v_rowid ridArray;
begin
select a.rowid bulk collect into v_rowid
from numservice a, mouse_subscriberkey b
where a.subscriberkey=b.subscriberkey
and SUBSCRIBERCBP=521
and rownum < 1000001;
forall i in 1 .. v_rowid.COUNT
update numservice set SUBSCRIBERCBP=527 where rowid= v_rowid(i);
commit;
dbms_output.put_line('update rows: '||v_rowid.COUNT);
end;
/
1,2的效率差不多,没有多少的差异;
SQL> set echo on
SQL> alter system flush shared_pool;
系统已更改。
SQL>
SQL> set timing on
SQL> declare
type rc is ref cursor;
l_rc rc;
l_dummy all_objects.object_name%type;
l_start number default dbms_utility.get_time;
begin
for i in 1 .. 1000
loop
open l_rc for
'select object_name
from all_objects
where object_id = ' || i;
fetch l_rc into l_dummy;
close l_rc;
end loop;
dbms_output.put_line
( round( (dbms_utility.get_time-l_start)/100, 2 ) ||
' seconds...' );
end;
/
PL/SQL 过程已成功完成。
已用时间: 00: 01: 13.03
例2
SQL> declare
type rc is ref cursor;
l_rc rc;
l_dummy all_objects.object_name%type;
l_start number default dbms_utility.get_time;
begin
for i in 1 .. 1000
loop
open l_rc for
'select object_name
from all_objects
where object_id = '
using i;
fetch l_rc into l_dummy;
close l_rc;
end loop;
dbms_output.put_line
( round( (dbms_utility.get_time-l_start)/100, 2 ) ||
' seconds...' );
end;
/
PL/SQL 过程已成功完成。
已用时间: 00: 00: 02.03 |
|