【问题标题】:How to use CURSORS to find No. of rows affected by UPDATE query如何使用 CURSORS 查找受 UPDATE 查询影响的行数
【发布时间】:2019-05-17 15:25:04
【问题描述】:
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” 当期望以下之一时: := 。 (@%;

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    您的实际错误是由无效语法引起的。在 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;
    

    【讨论】:

    • 如果您发现此答案有帮助,请考虑接受。接受的答案可以为未来的搜索者提高本网站的质量。
    【解决方案2】:

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

    【讨论】:

    • 感谢您指出。但是,还是会遇到问题。我认为问题出在 22 行。还是谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    相关资源
    最近更新 更多