pl / sql块将员工的工资增加15%。我无法获得15%的增量

时间:2017-04-27 18:46:28

标签: oracle plsql

DECLARE
    CURSOR cr_rohan IS
        SELECT *
        FROM   rohan
        WHERE  city='Mumbai'
        AND
        SET salary = (salary * 115)/100;

    name_rec rohan%rowtype;

BEGIN
    OPEN cr_rohan;

    LOOP
        FETCH cr_rohan INTO name_rec;

        dbms_output.put_line(name_rec.name||' '||name_rec.dept_no||' '||name_rec.job);

        exit WHEN cr_rohan%NOTFOUND;
    END LOOP;

    CLOSE cr_rohan;
END;
/

3 个答案:

答案 0 :(得分:3)

如果没有任何错误消息的好处,则表示您的光标定义格式不正确。

如果您打算将孟买的所有工资提高15%,则您的光标需要看起来像SELECT * FROM rohan WHERE city = 'Mumbai'

希望你桌上的东西是个人的关键。在这种情况下,您将在FETCH循环中执行工资更新:

UPDATE rohan SET salary = [adjusted salary] WHERE key = name_rec.key;

但是,如果你打算将孟买的所有工资增加15%(而不仅仅是某些人),那么简单的更新会更有效率。

UPDATE rohan SET salary = (salary * 1.15) WHERE city = 'Mumbai';

答案 1 :(得分:2)

您可以使用UPDATE语句,如果要列出已修改的行,可以使用RETURNING column BULK COLLECT INTO collection子句:

DECLARE
  names   SYS.ODCIVARCHAR2LIST;
  depts   SYS.ODCINUMBERLIST;
  jobs    SYS.ODCIVARCHAR2LIST;
BEGIN
  UPDATE rohan
  SET   salary = salary * 1.15
  WHERE city   = 'Mumbai';
  RETURNING name, dept_no, job
  BULK COLLECT INTO names, depts, jobs;

  FOR i IN 1 .. names.COUNT LOOP
    DBMS_OUTPUT.PUT_LINE( names(i) || ' ' || depts(i) || ' ' || jobs(i) );
  END LOOP;
END;
/

答案 2 :(得分:1)

首先,要更改表中的任何值,您必须使用UPDATE而不是select。 https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_10007.htm

其次,增加15%意味着您应该将当前值的15%添加到此值,因此它应该是工资+ 0.15 *工资。

最后,如果您一定需要使用PL / SQL块和循环。您应该使用游标或游标提取数据以进行更新,然后在循环中更新工资,但坦率地说,可以使用UPDATE语句在一行代码中完成。