oracle 不一致更新表中的所有薪金

vhipe2zx  于 2022-12-18  发布在  Oracle
关注(0)|答案(1)|浏览(114)

我尝试用下面的过程增加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薪金=薪金+...它的工作,但与我的代码不工作。

66bbxpm5

66bbxpm51#

如果您的表包含:

CREATE TABLE employees_copy (
  salary NUMBER(6,2)
);

然后你可以把-9999.999999.99之间的值放入列中,如果你试图设置一个超出这些界限的值,你会得到错误:

ORA-01438: value larger than specified precision allowed for this column

您可以:
1.使用较小的值;或
1.使用以下方法增加色谱柱的精密度:

ALTER TABLE employees_copy MODIFY (salary NUMBER(7,2));


然后你可以把从-99999.9999999.99的值放入列中。
但是,您可能还需要修复您的过程,以便在每个循环迭代中仅更新单个雇员(而不是在每个循环迭代中更新所有雇员):

PROCEDURE increase_salaries AS
BEGIN
  FOR r1 IN cur_emps LOOP
    UPDATE employees_copy
    SET   salary = 2 * salary;
    WHERE employee_id = r1.employee_id;
  END LOOP;
END increase_salaries;
/
  • 注意1:不要捕捉OTHERS异常。让异常发生,然后您可以调试它。*
  • 注2:程序中不要使用COMMIT;如果你这样做,你就不能把多个过程链接在一起,并且在一个过程失败时ROLLBACK它们。相反,COMMIT来自你调用过程的任何地方。*

相关问题