Происходит ошибка PL / SQL - PullRequest
       23

Происходит ошибка PL / SQL

0 голосов
/ 25 апреля 2018

Выбрать * с кота;

Попытка этого

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Вам не нужно включать таблицу JOB в запрос.У вас есть информация, которая вам требуется в: NEW namespace.Если не включить таблицу JOB в запрос, это остановит ошибку ORA-04091.

Также у вас есть два набора операторов управления курсором.Выбери один.Я предпочитаю неявный синтаксис курсора, потому что он менее типизирован (и немного более эффективен).

CREATE OR REPLACE TRIGGER Display_Update_Message 
BEFORE UPDATE ON JOBS
    FOR EACH ROW WHEN ((old.IsFilled != new.IsFilled) AND (new.isFilled = 'yes'))
BEGIN
    DBMS_OUTPUT.PUT_LINE('Seekers affected by closing job ' 
           || :new.JobID || ': ' || :new.JobName);
    FOR UT IN (SELECT JS.LastName
                     , JS.FirstName
                     , JS.Email Email
            FROM JOBAPPLICATIONS JA 
            FULL OUTER JOIN JOBSEEKERS JS ON JA.JSID = JS.JSID
            WHERE JA.JobID = :new.JobID )
    LOOP
        DBMS_OUTPUT.PUT_LINE('--' || UT.LastName || ', ' || UT.FirstName || '   ' || UT.Email);
    END LOOP;
    :new.StopDate := sysdate;
END;
/

Между прочим, я не уверен, почему в вашем курсоре есть FULL OUTER JOIN.Я бы подумал, что INNER JOIN - это правильное решение.Конечно, вы хотите только соискателей, которые подали заявку на работу, которую вы закрываете?Однако я оставил это, потому что я не знаю ваших бизнес-правил, и в любом случае я уже достаточно изменил ваш код :)

0 голосов
/ 25 апреля 2018

Вы дважды выбираете курсор:

Ваша проблема

[...]
OPEN UPDATETRIGGER;
FOR UT IN UPDATETRIGGER                  -- This performs fetching into UT
LOOP
    FETCH UPDATETRIGGER                          -- Here You Fetch again..
[...]

Как должна выглядеть ваша петля

CREATE OR REPLACE TRIGGER Display_Update_Message
    BEFORE UPDATE
    ON JOBS
    FOR EACH ROW
    WHEN ( (old.IsFilled != new.IsFilled) AND (new.isFilled = 'yes'))
DECLARE
    CURSOR UPDATETRIGGER
    IS
        SELECT J.JobID      JobID,
               J.JobName    JobName,
               J.StopDate   StopDate,
               JS.LastName  LastName,
               JS.FirstName FirstName,
               JS.Email     Email
          FROM JOBS  J
               FULL OUTER JOIN JOBAPPLICATIONS JA ON J.JobID = JA.JobID
               FULL OUTER JOIN JOBSEEKERS JS ON JA.JSID = JS.JSID
         WHERE J.JobID = :new.JobID;

    JobID       NUMBER (3);
    JobName     CHAR (30);
    LastName    CHAR (15);
    FirstName   CHAR (15);
    Email       CHAR (30);
    StopDate    DATE;
BEGIN
    DBMS_OUTPUT.PUT_LINE (
        'Seekers affected by closing job ' || JobID || ': ' || :new.JobName);

    OPEN UPDATETRIGGER;

    LOOP -- infinite loop
        FETCH UPDATETRIGGER
            INTO JobID,
                 JobName,
                 LastName,
                 FirstName,
                 Email,
                 StopDate;

        EXIT WHEN UPDATETRIGGER%NOTFOUND; -- loop-breaker

        :new.StopDate := SYSDATE;
        DBMS_OUTPUT.PUT_LINE (
            '--' || UT.LastName || ', ' || UT.FirstName || '   ' || UT.Email);
    END LOOP;

    CLOSE UPDATETRIGGER;
END;
...