我正在尝试收集一系列修订版数字.
我将用于删除多个审计表中的记录.
所以我编写了一个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中的数字.
这是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)
| 归档时间: |
|
| 查看次数: |
5905 次 |
| 最近记录: |