Курсор / навальный сбор - PullRequest
1 голос
/ 06 июля 2019

Я пытался отобразить hiredate, используя функцию отведения с курсором, однако я получаю это сообщение об ошибке - PLS-00435: оператор DML без BULK In-BIND не может использоваться внутри FORALL. Пожалуйста, ведите меня.

SET SERVEROUTPUT ON
DECLARE
CURSOR C_11 IS SELECT * FROM EMP;
TYPE DD IS TABLE OF EMP%ROWTYPE;
CC DD;
VV EMP.HIREDATE%TYPE;
GG EMP.HIREDATE%TYPE;
BEGIN
OPEN C_11;
LOOP
FETCH C_11 BULK COLLECT INTO CC LIMIT 1000;
FORALL I IN CC.FIRST..CC.LAST
SELECT HIREDATE,LEAD(HIREDATE) OVER(ORDER BY HIREDATE) INTO VV,GG FROM EMP;
DBMS_OUTPUT.PUT_LINE (VV ||' '||GG);
EXIT WHEN C_11%NOTFOUND;
END LOOP;
CLOSE C_11;
END;

1 Ответ

2 голосов
/ 06 июля 2019

PLS-00435: оператор DML без BULK In-BIND нельзя использовать внутри FORALL.

FORALL оператор используется только для INSERT / UPDATE или DELETEОн не поддерживает SELECT.

Прочитайте FORALL Ограничения:

https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/forall_statement.htm

В качестве альтернативы вы можете сделать это, как показано ниже:

DECLARE
    CURSOR c_11 IS 
      SELECT hiredate,
                   LEAD(hiredate) OVER( ORDER BY  hiredate ) DT           
            FROM emp;

    TYPE dd IS TABLE OF c_11%rowtype;
    cc   dd;
BEGIN
    OPEN c_11;

    LOOP
        FETCH c_11 BULK COLLECT INTO cc LIMIT 100;

        FOR i IN 1..cc.count
        LOOP            
          dbms_output.put_line(cc(i).hiredate || ' -- '  || cc(i).dt);              
       END LOOP;
       EXIT WHEN c_11%notfound;
    END LOOP;
    CLOSE c_11;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...