Почему «ADD_YEARS» неверный идентификатор? - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь использовать SQL "ADD_YEARS" в процедуре Oracle PLSQL.

Однако (при условии, что он действительно виноват) при компиляции возникает ошибка: «неверный идентификатор».

Я подозреваю, что это потому, что ADD_YEARS - это что-то из SQL, а не PLSQL. Кажется, они не любят друг друга. Единственный способ сделать это - создать локальную переменную и присвоить ей результат, который я обычно получал из ADD_YEARS. Однако, когда я пытался, я не мог понять, как на самом деле ... присвоить это значение. Есть SELECT INTO, но в этом случае это имеет смысл 0

-- If in good standing, extend membership 1 year. 
-- If not but within grace (6 months), extend to 1 year from today.
-- Otherwise, explain renewal involves penalty. If no ID, print message.

CREATE OR REPLACE PROCEDURE renew(id1 IN member.id%type) IS
    temp1 member.expr_date%type;
BEGIN
    SELECT expr_date INTO temp1 FROM member WHERE id = id1;

    IF temp1 > CURRENT_DATE THEN
        UPDATE member
        SET expr_date = ADD_YEARS(expr_date, 1)
        WHERE id = id1;
    ELSIF ADD_MONTHS(temp1, 6) > CURRENT_DATE THEN
        UPDATE member
        SET expr_date = ADD_YEARS(CURRENT_DATE, 1)
        WHERE id = id1;
    ELSE
        dbms_output.put_line('Renewal will incur a penalty!');
    END IF;

    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            dbms_output.put_line('That ID does not exist as a member!');
END;
/
show errors

Вот ошибка, которую я получаю:

Errors for PROCEDURE RENEW:

LINE/COL ERROR
-------- -----------------------------------------------------------------
7/3  PL/SQL: SQL Statement ignored
8/19     PL/SQL: ORA-00904: "ADD_YEARS": invalid identifier
11/3     PL/SQL: SQL Statement ignored
12/19    PL/SQL: ORA-00904: "ADD_YEARS": invalid identifier

Большое спасибо за любую помощь! Я все еще очень плохо знаком с SQL и PL / SQL. Преодолеть некоторые его причуды было сложно.

1 Ответ

4 голосов
/ 26 апреля 2019

Как уже упоминалось в моих комментариях, вы не можете использовать ADD_YEARS, поскольку в Oracle ничего не существует как ADD_YEARS. Вы можете использовать ADD_MONTHS или INTERVAL предложение.

Таким образом, вы можете изменить свой оператор обновления блока следующим образом:

SET expr_date = ADD_YEARS (expr_date, 1)

1)  SET expr_date = ADD_MONTHS(expr_date, 12)

Или

2) SET expr_date = expr_date + interval '1' YEAR 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...