2015-01-13 4 views
0

개정 번호 배열을 수집하려고합니다.
여러 감사 테이블에서 레코드를 삭제하는 데 사용하겠습니다.
그래서 나는 그 배열을 수집하고 내가 레브의oracle 대량 삭제 : 테이블에서 삭제

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

데이터 유형이 표에서 숫자는 무엇입니까 해당 배열

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'); 

를 사용하여 조건에 따라 다른 테이블에서 삭제 실행하기 위해 PLSQL을 썼다.

+0

왜 PL/SQL 당신은 단순히 SQL에서 그것을 할 수있을 때? –

+0

데이터가 매우 거대합니다 .. 시간을 실행하고 싶습니다 – Sahu

+0

데이터가 거대한 경우 컨텍스트 스위칭이 커지고 PL/SQL은 SQL보다 느리고 속도가 느립니다. –

답변

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; 

좋은 후보 : 다음

create type NumberArray as table of number; 

및 사용 like

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; 
3

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가 이미 작성한 것처럼 중첩 테이블은 스키마 수준에서 만들어야합니다.

1

일반에서 수행 할 수있는 경우 PL/SQL은 왜 그렇게할까요? 두 엔진 사이에 컨텍스트 전환 불필요하게 소개하고 있습니다.

그 모든 PL/SQL 코드는 간단한 DELETE 문에 불과하다 -

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 
);