使用BULK COLLECT删除许多记录

时间:2016-08-05 05:17:27

标签: sql database oracle plsql

我正在尝试使用BULK COLLECT概念删除数千条记录。表的记录唯一性由4列定义,即NUMBER_ID,JOB_VALUE,JOB_TYPE,JOB_DATE。我需要根据这四列删除记录。我写了以下代码。然而它错误地说1." V_JOB_VAL'不适合作为转让声明的左侧" 2.游标属性可能不适用于非游标" L_JOB_RID"。你能否说一下我做错了什么?

** Edited Code **

ALTER TABLE JOB_SAMPLE NOLOGGING;

ALTER SESSION ENABLE PARALLEL DML;

DECLARE 

TYPE V_JOB_RID IS TABLE OF JOB_SAMPLE.JOB_ROW_ID%TYPE;
TYPE V_JOB_DT IS TABLE OF JOB_SAMPLE.JOB_DATE%TYPE;
TYPE V_JOB_TY IS TABLE OF JOB_SAMPLE.JOB_TYPE%TYPE;
TYPE V_JOB_VAL IS TABLE OF JOB_SAMPLE.JOB_VALUE%TYPE;

L_JOB_RID V_JOB_RID := V_JOB_RID();
L_JOB_DT V_JOB_DT := V_JOB_DT();
L_JOB_TY V_JOB_TY := V_JOB_TY();
L_JOB_VAL V_JOB_VAL := V_JOB_VAL();
L_DELETE_BUFFER PLS_INTEGER := 50000;

CURSOR CDELETE IS

SELECT  /*+ PARALLEL(10) */ 
       T3.JOB_ROW_ID, 
       T3.JOB_DATE, 
       T3.JOB_TYPE, 
       T3.JOB_VALUE
FROM   JOB_T1 T1, 
       JOB_T2 T2, 
       JOB_SAMPLE T3
WHERE T1.ROW_ID = T2.JOB_T1_ID
AND   T3.JOB_ROW_ID = T1.JOB_ID
AND   T2.T2_VAL = T3.JOB_VALUE
AND   T1.NAME = T3.JOB_TYPE
AND   TO_DATE(T2.T2_DT,'DD-MON-YY') = TO_DATE(T3.JOB_DATE,'DD-MON-YY');

BEGIN

OPEN CDELETE;
LOOP
FETCH CDELETE BULK COLLECT INTO L_JOB_RID, L_JOB_DT, L_JOB_TY, L_JOB_VAL LIMIT L_DELETE_BUFFER;
EXIT WHEN L_JOB_RID.COUNT < L_DELETE_BUFFER;
FORALL I IN 1..L_JOB_RID.COUNT

DELETE /*+ PARALLEL(10) */ JOB_SAMPLE 
WHERE  JOB_ROW_ID = L_JOB_RID(I)
AND    JOB_DATE = L_JOB_DT(I)
AND    JOB_TYPE = L_JOB_TY(I)
AND    JOB_VALUE = L_JOB_VAL(I);

COMMIT;

END LOOP;

CLOSE CDELETE;

COMMIT;

END;

ALTER SESSION DISABLE PARALLEL DML;

请告诉我。

谢谢!

1 个答案:

答案 0 :(得分:1)

首先改变

FETCH CDELETE BULK COLLECT INTO L_JOB_RID, L_JOB_DT, L_JOB_TY, V_JOB_VAL

进入

FETCH CDELETE BULK COLLECT INTO L_JOB_RID, L_JOB_DT, L_JOB_TY, L_JOB_VAL