如何使用游标查找受UPDATE查询影响的行数

时间:2018-12-17 09:24:21

标签: oracle plsql

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”   当期望以下之一时::=。 (@%;

2 个答案:

答案 0 :(得分:4)

您的实际错误是由无效语法引起的。在PL / SQL中,它是ELSIF而不是ELSEIF,尽管由于您没有实现多分支开关,因此只需要ELSEEND 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;