0
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 语句打印值时,对于这两种情况,before 和 after,我都得到了变量 v_total 的数值。

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

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

此外,我尝试在上述语句中对 total_emp 列的值进行硬编码,并且它起作用了。

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

请帮我。

4

1 回答 1

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;

分享和享受。

于 2013-04-02T15:56:48.497 回答