为什么“ ADD_YEARS”是无效的标识符?

时间:2019-04-26 03:51:29

标签: sql oracle plsql

我正在尝试在Oracle PLSQL过程中使用SQL的“ ADD_YEARS”。

但是,(假设实际上是要怪)它在编译时出现错误:“无效标识符”。

我怀疑这是因为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 个答案:

答案 0 :(得分:4)

正如我的评论中所述,您不能使用ADD_YEARS,因为在Oracle中不存在ADD_YEARS。您可以依次使用ADD_MONTHSINTERVAL子句。

因此您可以将代码块更新语句修改为:

  

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