我正在尝试使用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;
请告诉我。
谢谢!
答案 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