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

Sah*_*ahu 0 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_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');
Run Code Online (Sandbox Code Playgroud)

我正进入(状态

 PLS-00382: expression is of wrong type
 06550. 00000 -  "line %s, column %s:\n%s"
 *Cause:    Usually a PL/SQL compilation error.
Run Code Online (Sandbox Code Playgroud)

rev的数据类型是table1中的数字.

Mar*_*ski 6

这是FORALL声明的一个很好的候选者

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;
Run Code Online (Sandbox Code Playgroud)

但是如果你仍然坚持使用IN条件,你必须在模式级别定义你的类型:

create type NumberArray as table of number;
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它

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;
Run Code Online (Sandbox Code Playgroud)