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


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

您的实际错误是由无效语法引起的。在PL/SQL中,它是ELSIF而不是ELSEIF,尽管由于您没有实现多分支交换机,所以您只需要ELSEEND IF也是两个单词。此外,它是dbms_output.put_line()而不是putline

如果你修复了所有这些错误,你的例程就会运行。

然而,sql%found告诉我们我们的DML是否达到任何记录,但没有告诉我们有多少记录。所以affected_emp在您的代码中将为null。

找到受影响记录数的最简单方法是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;

您应该使用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;

最新更新