Как использовать CURSORS, чтобы найти количество строк, затронутых запросом UPDATE - PullRequest
0 голосов
/ 17 декабря 2018
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 голосов
/ 17 декабря 2018

Ваша фактическая ошибка вызвана неверным синтаксисом.В 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;
0 голосов
/ 17 декабря 2018

Вы должны использовать 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;

синтаксис IF-THEN-ELSIF-ELSE в Oracle / PLSQL:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...