SQL% ROWCOUNT работает с FORALL
См. Пример ниже:
-- Data preparation
CREATE TABLE EMPLOYEES (
EMPID NUMBER,
EMPNAME VARCHAR2(100)
);
INSERT INTO EMPLOYEES VALUES (
1,
'a'
);
INSERT INTO EMPLOYEES VALUES (
2,
'b'
);
INSERT INTO EMPLOYEES VALUES (
3,
'c'
);
INSERT INTO EMPLOYEES VALUES (
4,
'a'
);
INSERT INTO EMPLOYEES VALUES (
5,
'e'
);
SELECT * FROM EMPLOYEES;
-- FORALL update in the block
SET SERVEROUT ON
DECLARE
TYPE T_BULK_COLLECT_TEST IS
TABLE OF EMPLOYEES%ROWTYPE;
L_TAB T_BULK_COLLECT_TEST;
CURSOR C_DATA IS
SELECT
*
FROM
EMPLOYEES;
BEGIN
OPEN C_DATA;
FETCH C_DATA BULK COLLECT INTO L_TAB;
FORALL I IN 1..L_TAB.COUNT
UPDATE EMPLOYEES
SET
EMPNAME = L_TAB(I).EMPNAME || L_TAB(I).EMPNAME
WHERE
EMPID = L_TAB(I).EMPID;
DBMS_OUTPUT.PUT_LINE('1) SQL%ROWCOUNT IS ' || SQL%ROWCOUNT);
CLOSE C_DATA;
DELETE FROM EMPLOYEES;
DBMS_OUTPUT.PUT_LINE('2) SQL%ROWCOUNT IS ' || SQL%ROWCOUNT);
COMMIT;
OPEN C_DATA;
FETCH C_DATA BULK COLLECT INTO L_TAB;
FORALL I IN 1..L_TAB.COUNT
UPDATE EMPLOYEES
SET
EMPNAME = L_TAB(I).EMPNAME || L_TAB(I).EMPNAME
WHERE
EMPID = L_TAB(I).EMPID;
DBMS_OUTPUT.PUT_LINE('3) SQL%ROWCOUNT IS ' || SQL%ROWCOUNT);
CLOSE C_DATA;
END;
/
-- Output after data is updated
SELECT * FROM EMPLOYEES;
Так, в соответствии с моим примером, он хранит количество строк, затронутых в SQL% ROWCOUNT, даже если мы используем FORALL. ---- НО НО, НО, если я удаляю «COMMIT» после оператора «DELETE», то я также сталкиваюсь с той же проблемой, что и вы.
Таким образом, решение вашей проблемы - это COMMIT
оператор. Попробуйте запустить код с помощью оператора commit сразу после удаления.
Надеюсь, это полезно для вас.
Обновлено
BEGIN
OPEN C_DATA;
FETCH C_DATA BULK COLLECT INTO L_TAB;
FORALL I IN 1..L_TAB.COUNT
UPDATE EMPLOYEES
SET
EMPNAME = L_TAB(I).EMPNAME || L_TAB(I).EMPNAME
WHERE
EMPID = L_TAB(I).EMPID;
DBMS_OUTPUT.PUT_LINE('1) SQL%ROWCOUNT IS ' || SQL%ROWCOUNT);
CLOSE C_DATA;
DELETE FROM EMPLOYEES;
DBMS_OUTPUT.PUT_LINE('2) SQL%ROWCOUNT IS ' || SQL%ROWCOUNT);
SAVEPOINT A; --- IMP
OPEN C_DATA;
FETCH C_DATA BULK COLLECT INTO L_TAB;
FORALL I IN 1..L_TAB.COUNT
UPDATE EMPLOYEES
SET
EMPNAME = L_TAB(I).EMPNAME || L_TAB(I).EMPNAME
WHERE
EMPID = L_TAB(I).EMPID;
DBMS_OUTPUT.PUT_LINE('3) SQL%ROWCOUNT IS ' || SQL%ROWCOUNT);
CLOSE C_DATA;
END;
/