使用游标for循环更新列时标识符无效?

时间:2015-04-20 09:20:38

标签: plsql cursor

我正在尝试使用游标更新表格中的薪水栏。 这是我的代码:

declare
cursor c1 is
select * from emp2_1030082;
begin
for c3 in c1
loop
if(c3.salary>10000)
then
update emp2_1030082 set c3.salary=c3.salary + c3.salary/10 ;
elsif(c3.salary<=10000)
then
update emp2_1030082 set c3.salary= c3.salary + c3.salary/20 ;
end if;
end loop;
end;

但是我收到了这个错误:

 ORA-06550: line 9, column 47:
    PL/SQL: ORA-00904: "C3"."SALARY": invalid identifier
    ORA-06550: line 9, column 1:
    PL/SQL: SQL Statement ignored
    ORA-06550: line 12, column 25:
    PL/SQL: ORA-00904: "C3"."SALARY": invalid identifier
    ORA-06550: line 12, column 1:
    PL/SQL: SQL Statement ignored
    06550. 00000 -  "line %s, column %s:\n%s"
    *Cause:    Usually a PL/SQL compilation error.
    *Action:

1 个答案:

答案 0 :(得分:1)

第一个问题是,你真的需要在游标中这样做吗?因为执行这两个语句应该做你想要的:

update emp2_1030082 set salary=salary + salary/10 where salary > 10000;
update emp2_1030082 set salary=salary + salary/20 where salary <= 10000;

同时,你得到的错误是因为

update emp2_1030082 set c3.salary=c3.salary + c3.salary/10 ;

通过使用c3.中的set c3.salary,您指的是光标,而不是您要更新的表中的列名。只需salary(以及其他更新)也应该让错误消失,但是,你会在每次更新时更新所有行,所以很确定这不是你想要的。< / p>

要使用游标执行此操作,您应该从不属于它的位置删除c3.,然后添加where子句以仅更新当前记录。希望你有一些独特的ID,然后它会是这样的:

update emp2_1030082 set salary=c3.salary + c3.salary/10 where id = c3.id;