我尝试用下面的过程增加employee表的所有薪水。问题是薪水列做了一些奇怪的事情,像变量一样工作,因为它保存了游标中最后一个雇员的薪水,并加到下一个雇员的薪水上,所以,在最后我得到了一个错误ORA-01438:值大于此列允许的指定精度
PROCEDURE increase_salaries AS
v_emp NUMBER;
v_sal NUMBER;
BEGIN
FOR r1 IN cur_emps LOOP
v_emp := r1.employee_id;
v_sal := r1.salary;
UPDATE employees_copy
SET
salary = salary + salary;
COMMIT;
-- salary = salary + salary * v_salary_increase_rate;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
print('Error in employee '||v_emp);
END increase_salaries;
谢谢
我知道我可以先用一个SELECT INTO的实际工资和重新初始化为0,但我看到许多例子在互联网上使用UPDATE薪金=薪金+...它的工作,但与我的代码不工作。
1条答案
按热度按时间66bbxpm51#
如果您的表包含:
然后你可以把
-9999.99
到9999.99
之间的值放入列中,如果你试图设置一个超出这些界限的值,你会得到错误:您可以:
1.使用较小的值;或
1.使用以下方法增加色谱柱的精密度:
型
然后你可以把从
-99999.99
到99999.99
的值放入列中。但是,您可能还需要修复您的过程,以便在每个循环迭代中仅更新单个雇员(而不是在每个循环迭代中更新所有雇员):
OTHERS
异常。让异常发生,然后您可以调试它。*COMMIT
;如果你这样做,你就不能把多个过程链接在一起,并且在一个过程失败时ROLLBACK
它们。相反,COMMIT
来自你调用过程的任何地方。*