2013-04-02 41 views
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語句來打印值時,對於這兩種情況,在獲取變量v_total的數值之前和之後。PL/SQL - 列值更新爲0而不是數值

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

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

此外,我試圖在上面的語句中爲total_emp列的硬編碼值,它工作。

因此,問題是在更新語句中使用它時沒有更新到列的變量值。

請幫幫我。

+2

「* total_emp is varchar2(20)*」。哎喲!!!做***不***存儲字符列中的數字。決不。永遠。 –

+0

它是否更新爲零,還是已經爲零並且未更新到期望值?你真的在'emp3'中有一行'dept_no = 40' - 那裏的where子句仍然存在於你的硬編碼值版本中? –

回答

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; 

分享和享受。