今天乙個同事寫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
ist_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
ist_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儲存過程中is和as區別
一直糾結於儲存過程的is與as最近在網上查了巨多資料,總結如下 在儲存過程 procedure 和函式 function 中沒有區別 在檢視 view 中只能用as不能用is 在游標 cursor 中只能用is不能用as。從其定義也可以看出沒什麼區別,要是有估計暫時也很少有人發下 create or...
儲存過程中呼叫儲存過程
use northwind go 儲存過程1 功能 通過員工firstname inputempfirstname 獲得 員工id outid if exists select name from sysobjects where name p getempleeidbyname and type ...
Oracle儲存過程中的異常處理
1.問題 oracle中可以用dbms output.put line來列印提示資訊,但是很容易緩衝區就溢位了。可以用dbms output.enable 1000000 來設定緩衝區的大小。但是有大小,就有可能再溢位 程式寫得太爛,錯誤不斷,不好意思 於是想把異常資訊寫到乙個表中。2.建表 這個容...