Могу ли я объявить CURSOR после инструкции триггера BEGIN в Oracle?

Мне нужно создать CURSOR после инструкции BEGIN в триггере на основе такого условия:

IF :OLD.DWF_STATUS = 'P' AND :NEW.DWF_STATUS = 'C' THEN

    DECLARE CURSOR cur_list IS
        SELECT DISTINCT DR_PRJ_ID, STR_EMAIL, DWFU_US_ID
        FROM DOC_WORKFLOW JOIN DOC_WF_USERS ON DWFU_DWF_ID = DWF_ID
        JOIN DOCUMENT_REF ON DWF_DR_ID = DR_ID AND DR_TYPE = 'P'
        LEFT OUTER JOIN ST_REGISTER ON STR_ID = DWFU_STR_ID
        WHERE DWF_ID = :NEW.DWF_ID;

END IF;

Когда я компилирую, я получаю такую ​​ошибку:

Ошибка (99,5): PLS-00103: Обнаружен символ «КОНЕЦ» при ожидании одного из следующих событий:
функция начала прагмы тип подтипа процедуры
текущее удаление курсора существует ранее

Как я могу объявить курсор после оператора BEGIN триггера в Oracle?


person Community    schedule 17.08.2018    source источник


Ответы (1)


DECLARE - это начало блока PL / SQL. Блок состоит из необязательного раздела DECLARE, за которым следует раздел BEGIN, необязательный раздел EXCEPTION и, наконец, END.

У вас есть вложенный блок. Oracle ожидает, что вы последуете за ним BEGIN и END. Нравится:

IF :OLD.DWF_STATUS = 'P' AND :NEW.DWF_STATUS = 'C' THEN

    DECLARE CURSOR cur_list IS
        SELECT DISTINCT DR_PRJ_ID, STR_EMAIL, DWFU_US_ID
        FROM DOC_WORKFLOW JOIN DOC_WF_USERS ON DWFU_DWF_ID = DWF_ID
        JOIN DOCUMENT_REF ON DWF_DR_ID = DR_ID AND DR_TYPE = 'P'
        LEFT OUTER JOIN ST_REGISTER ON STR_ID = DWFU_STR_ID
        WHERE DWF_ID = :NEW.DWF_ID;

    begin
        -- some code here

    end;

END IF;

То есть вы должны написать код для использования курсора в блоке, определенном оператором DECLARE. Это связано с тем, что область видимости PL / SQL означает, что на переменные нельзя ссылаться за пределами блока, в котором они объявлены.

Возникает вопрос, почему вы объявляете этот курсор во вложенном блоке? Когда просто не объявить его в верхней части корпуса спускового крючка?

person APC    schedule 17.08.2018