轉載鏈接:http://lin49940.iteye.com/blog/466626
今天一個同事寫oracle 的存儲過程遇到了一個問題, 他在里面update 操作不能完成更新的操作, 但是又不會報錯.
如一個表 A(id, code, name, type)
在存儲過程中的更新操作的語句: update A x set x.type = 變量A where x.code = 變量B;
變量A 和 變量B 都定義好了, 並且都成功賦值了.
這是一個很簡單的更新語句, 簡單到一開始對為什么發生這樣的錯誤不知所措. 其實出錯的原因是在於 變量A 或 變量B 的定義上, 如:
creat or replace procedure p_AA
is
t_type varchar2(20);
code number(10);
begin
t_type := 'AA';
code := 100
update A x set x.type = t_type where x.code = code ;
commit;
end;
執行成功, 但是update 操作沒有成功, 沒有報什么錯誤. 其實原因在於變量code 跟 表A 中的字段code 的名字相同造成的. 看下面的:
creat or replace procedure p_AA
is
t_type varchar2(20);
t_code number(10);
begin
t_type := 'AA';
t_code := 100
update A x set x.type = t_type where x.code = t_code ;
commit;
end;
執行成功, update操作也成功. 所以原因在與變量的名稱上面(還有一個值得注意的地方, 如果code字段是char型的, 變量的長度跟字段code的長度如果不一致, 比較會不成功,' 100' 和 '100' 是不對等的, 這也是容易犯的一個錯誤, 在此記錄下)
還有一個地方要注意:
creat or replace procedure p_AA(code in number) --code作為參數, 就算跟表A 的字段名稱一樣, 也不會有影響
is
t_type varchar2(20);
begin
t_type := 'AA';
update A x set x.type = t_type where x.code = code ;
commit;
end;
執行 execute p_AA(100) 成功, 更新操作也成功. code如果是參數, 跟表A 的字段名稱一樣, 也不會有影響.
我一般變量都會加t_ 或 p_, 所以以前沒遇到這個問題, 為了防止以后可能再次遇到這個問題和也遇到這個問題的朋友, 在此留下這篇博客作為備忘.
小龍評論
平時很少寫Oracle的存儲過程,最近為了處理一批異常的數據,嫌寫程序調試麻煩,就使用存儲過程,遇到了相同問題,是變量名和要更新的表字段名相同了。
不報錯,的確不方便找原因,轉載備忘。