PL / SQL - 列值更新为0而不是数值

时间:2013-04-02 14:25:15

标签: plsql oracle11g sql-update

Declare
v_cnt varchar2(20); 
v_cnd varchar2(20);
v_total varchar2(20);

begin

select count(emp_id) into v_cnt from emp1;
select count(emp_id) into v_cnd from emp2;
v_total:=v_cnt+v_cnd;

dbms_output.put_line('before');
dbms_output.put_line(v_total);

update emp3 set total_emp=v_total where dept_no=40;
commit;

dbms_output.put_line('after');
dbms_output.put_line(v_total);

end;

在上面的程序中,列total_emp的值更新为0而不是数值。 但是,当我使用dbms_output语句打印值时,对于前后两种情况,我都得到变量v_total的数值。

v_total值未更新为表中的列值。

total_emp的表列定义是varchar2(20)。

另外,我尝试在上面的语句中对total_emp列进行硬编码,并且它有效。

因此,当在更新语句中使用时,问题是变量值,它不会更新到列。

请帮帮我。

1 个答案:

答案 0 :(得分:1)

您声明的变量应该是NUMBER类型而不是VARCHAR2,因为您打算在计算中使用它们。我还建议您添加一个异常处理程序来报告可能发生的任何错误。显示更新会影响多少行也是一个好主意。您可能希望将代码重写为:

Declare
  v_cnt NUMBER; 
  v_cnd NUMBER;
  v_total NUMBER;
begin
  select count(emp_id)
    into v_cnt
    from emp1;

  select count(emp_id)
    into v_cnd
    from emp2;

  v_total:=v_cnt+v_cnd;

  dbms_output.put_line('before');
  dbms_output.put_line(v_total);

  update emp3
    set total_emp=v_total
    where dept_no=40;

  DBMS_OUTPUT.PUT_LINE('Number of rows updated=' || SQL%ROWCOUNT);

  commit;

  dbms_output.put_line('after');
  dbms_output.put_line(v_total);
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('Exception: ' || SQLCODE || '  ' || SQLERRM);
    ROLLBACK;
end;

分享并享受。