2024年4月9日 星期二

Oracle的預儲程序參數與資料表名稱相同時的異常

Oracle的預儲程序參數與資料表名稱相同時的異常

最近踩了一個坑,主要是一個預儲程序利用給定的參數來做查詢,再將查詢到的資料寫入變數,原本都還很正常,但是突然失效,偏偏單獨的查詢都很正常,遍尋不著,後來同事協助之後終於脫坑。

create or replace procedure test_proc(p_a varchar2) is
begin
	select column into v_column from table where column_a = p_a;	
end

上面是一個示意的範例,test_proc這個預儲程序在得到p_a之後就會去資料表查詢,然後將資料寫入v_column,但不知道什麼時候,資料表中被加入一個同名欄位,也就是p_a,這導致了參數中的p_a就失效了。

這可能就代表著在oracle的預儲程序中,整個上下文還是會以查詢資料表為主,查詢資料表沒有對應欄位名稱的時候才會以變數做為條件?

這很頭痛的是,這是無聲異常,而且還可能造成大量異常,不得不防,以後預儲函數的參數必需要設置的非常怪異,才不會有機會跟未來人命名欄位名稱相同。