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;
/
答案 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语句在一行代码中完成。