oracle批量删除:从数组中列所在的表中删除

oracle批量删除:从数组中列所在的表中删除,oracle,plsql,Oracle,Plsql,我正试图收集一系列的数字。我将使用删除多个审核表中的记录。 所以我编写了一个plsql来收集该数组,并根据使用该数组的条件在其他表上运行delete declare type NumberArray is table of number index by binary_integer; revisions NumberArray; Begin select rev bulk collect into revisions from ( select t.rev, row_nu

我正试图收集一系列的数字。我将使用删除多个审核表中的记录。 所以我编写了一个plsql来收集该数组,并根据使用该数组的条件在其他表上运行delete

declare 
  type NumberArray is table of number index by binary_integer;
  revisions NumberArray;
Begin
  select rev bulk collect into revisions from (
    select t.rev, row_number() over (partition by 
        column1,
        column2
        order by column3) rn
    from table1 t)
  where rn <> 1;

  dbms_output.put_line(revisions.count || ' records found from table2 to be deleted');
  delete from table2 where rev in (revisions);
  dbms_output.put_line('deleted from table2');

rev的数据类型是表1中的数字。

这是一个很好的语句候选者

declare 
  type NumberArray is table of number(10) index by binary_integer;
  revisions NumberArray;
Begin
  select rev bulk collect into revisions from (
    select t.rev, row_number() over (partition by 
        column1,
        column2
        order by column3) rn
    from table1 t)
  where rn <> 1;

  dbms_output.put_line(revisions.count || ' records found from table2 to be deleted');
  forall i in revisions.first .. revisions.last
       delete from table2 where rev = revisions(i);
  dbms_output.put_line('deleted from table2');
End;
然后像这样使用它

declare 
  revisions NumberArray;
Begin
  select rev bulk collect into revisions from (
    select t.rev, row_number() over (partition by 
        column1,
        column2
        order by column3) rn
    from table1 t)
  where rn <> 1;

  dbms_output.put_line(revisions.count || ' records found from table2 to be deleted');
  delete from table2 where rev in (select column_value from table(revisions));
  dbms_output.put_line('deleted from table2');
End;
一定是这个:

delete from table2 where rev MEMBER OF revisions;

or 

delete from table2 where rev =ANY (SELECT COLUMN_VALUE FROM TABLE(revisions));

or 

forall i in revisions.FIRST..revisions.LAST
delete from table2 where rev = revisions(i);

or 

delete from table2 where rev =ANY (
select rev 
from (
    select t.rev, row_number() over (partition by 
        column1,
        column2
        order by column3) rn
    from table1 t)
  where rn <> 1
);

or (not the preferred way of doing it)

for i in revisions.FIRST..revisions.LAST LOOP
   delete from table2 where rev = revisions(i);
END LOOP;

正如Marcin Wroblewski所写的那样,嵌套表必须在模式级别创建。

既然可以在普通SQL中创建,为什么还要在PL/SQL中创建呢?您在两个引擎之间引入了不必要的上下文切换

所有这些PL/SQL代码只不过是一个简单的DELETE语句-


为什么要使用PL/SQL,而只需使用SQL就可以了?数据非常庞大。。我想计算一下运行时间,如果数据量很大,那么上下文切换就会很大,PL/SQL会慢很多,比SQL慢很多。
declare 
  revisions NumberArray;
Begin
  select rev bulk collect into revisions from (
    select t.rev, row_number() over (partition by 
        column1,
        column2
        order by column3) rn
    from table1 t)
  where rn <> 1;

  dbms_output.put_line(revisions.count || ' records found from table2 to be deleted');
  delete from table2 where rev in (select column_value from table(revisions));
  dbms_output.put_line('deleted from table2');
End;
delete from table2 where rev MEMBER OF revisions;

or 

delete from table2 where rev =ANY (SELECT COLUMN_VALUE FROM TABLE(revisions));

or 

forall i in revisions.FIRST..revisions.LAST
delete from table2 where rev = revisions(i);

or 

delete from table2 where rev =ANY (
select rev 
from (
    select t.rev, row_number() over (partition by 
        column1,
        column2
        order by column3) rn
    from table1 t)
  where rn <> 1
);

or (not the preferred way of doing it)

for i in revisions.FIRST..revisions.LAST LOOP
   delete from table2 where rev = revisions(i);
END LOOP;
DELETE FROM table2 WHERE rev IN(
   SELECT rev FROM(
      select t.rev, row_number() over (partition by 
              column1,
              column2
              order by column3) rn
      from table1 t)
  where rn <> 1
);