CREATE TABLE cursor_example(
emp_id NUMBER(10) PRIMARY KEY,
emp_name VARCHAR2(30),
emp_salary NUMBER(6)
);
SELECT * FROM cursor_example;
INSERT INTO cursor_example VALUES(1234,'apple',1250);
INSERT INTO cursor_example VALUES(1235,'banana',1500);
INSERT INTO cursor_example VALUES(1236,'carrot',1750);
INSERT INTO cursor_example VALUES(1237,'donkey',2050);
INSERT INTO cursor_example VALUES(1238,'elixr',15075);
UPDATE cursor_example
SET emp_salary = emp_salary + (.25*emp_salary);
DECLARE affected_emp NUMBER(2);
BEGIN
UPDATE cursor_example
SET emp_salary = emp_salary + (.25*emp_salary);
IF sql%notfound THEN
DBMS_OUTPUT.PUTLINE('NO PEOPLE AFFECTED');
ELSEIF sql%found THEN
DBMS_OUTPUT.PUTLINE(affected_emp || 'PEOPLE AFFECTED');
ENDIF;
END;
我收到的错误消息是:
ORA-06550:第7行,第12列:PLS-00103:遇到符号“ SQL” 当期望以下之一时::=。 (@%;
答案 0 :(得分:4)
您的实际错误是由无效语法引起的。在PL / SQL中,它是ELSIF
而不是ELSEIF
,尽管由于您没有实现多分支开关,因此只需要ELSE
。 END IF
也是两个词。此外,它是dbms_output.put_line()
而不是putline
。
如果修复所有这些错误,则例程将运行。
但是,sql%found
告诉我们DML是否命中了任何记录,但没有告诉我们有多少记录。因此,affected_emp
在您的代码中将为空。
查找受影响的记录数的最简单方法是sql%rowcount
,它为我们提供了由前面的DML语句插入,更新或删除的记录数。零表示没有记录被更改。
很明显,您只可以输出该图,但这就是它在代码中的样子:
DECLARE
affected_emp NUMBER(2);
BEGIN
UPDATE cursor_example
SET emp_salary = emp_salary + (.25*emp_salary);
affected_emp := sql%rowcount;
IF affected_emp = 0 THEN
DBMS_OUTPUT.PUT_LINE('NO PEOPLE AFFECTED');
ELSE
DBMS_OUTPUT.PUT_LINE(affected_emp || ' PEOPLE AFFECTED');
END IF;
END;
答案 1 :(得分:1)
您应该使用ELSIF(或ELSE):
ELSIF sql%found THEN
DBMS_OUTPUT.put_line(affected_emp || 'PEOPLE AFFECTED');
END IF;
或ELSE
:
ELSE
DBMS_OUTPUT.put_line(affected_emp || 'PEOPLE AFFECTED');
END IF;
Oracle / PLSQL中IF-THEN-ELSIF-ELSE的语法为:
IF condition1 THEN {...statements to execute when condition1 is TRUE...} ELSIF condition2 THEN {...statements to execute when condition2 is TRUE...} ELSE {...statements to execute when both condition1 and condition2 are FALSE...} END IF;