我正在尝试在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还是很陌生。克服它的一些怪异之处很困难。
答案 0 :(得分:4)
正如我的评论中所述,您不能使用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