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

Plsql PL/SQL-列值更新为0,而不是数值,plsql,oracle11g,sql-update,Plsql,Oracle11g,Sql Update,在上面的程序中,列total_emp的值将更新为0,而不是数值。 然而,当我使用dbms_输出语句打印值时,对于这两种情况,在之前和之后,我都会得到变量v_total的数值 v_总值未更新为表中的列值 总emp的表列定义为varchar2(20) 此外,我还尝试在上面的语句中硬编码total_emp列的值,结果成功了 所以,问题是在update语句中使用变量值时,它不会更新到列 请帮助我。您声明的变量应该是NUMBER类型,而不是VARCHAR2类型,因为您打算在计算中使用它们。我还建议您添加一

在上面的程序中,列total_emp的值将更新为0,而不是数值。 然而,当我使用dbms_输出语句打印值时,对于这两种情况,在之前和之后,我都会得到变量v_total的数值

v_总值未更新为表中的列值

总emp的表列定义为varchar2(20)

此外,我还尝试在上面的语句中硬编码total_emp列的值,结果成功了

所以,问题是在update语句中使用变量值时,它不会更新到列


请帮助我。

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

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;

分享和享受。

“总emp为varchar2(20)”。哎哟不要在字符列中存储数字。从未。曾经。它是被更新为零,还是已经为零并且没有被更新为预期值?您是否在
emp3
中实际有一行
dept_no=40
-您的硬编码值版本中还有where子句?
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;