今天一個朋友問我下面這段sql語句的問題,我發現了他竟然把程序員的編程思想帶入了oracle,雖然是錯誤的,但也是很經典的錯誤啊。

create or replace package p_view_param is function set_param(num VARCHAR2) return VARCHAR2; function get_param return VARCHAR2; end p_view_param; CREATE or replace package body p_view_param is paramValue VARCHAR2; -- Param function set_param(num VARCHAR2) return VARCHAR2 is begin paramValue:=num; --dbms_output.put_line('num'||num); return num; end; function get_param return VARCHAR2 is begin dbms_output.put_line('paramValue'||paramValue); return paramValue; end; END p_view_param; BEGIN SELECT p_view_param.set_param('sss')AS temp FROM dual; END;
執行時發現錯誤:
這段sql主要兩個問題:
1.參數變量名盡量不要num這些特殊意義的單詞;
2.包里面的方法是獨立的個體,包只是根據相關功能把函數和存儲過程封裝在一起罷了,而函數之間是獨立的,不存在共享變量之類的。如果確實需要就設計為參數傳遞即可。
3.創建包和創建包體之間分開,不要一起創建。否則創建包的時候會把包體帶進去。
修正后的sql如下:

create or replace package p_view_param is function set_param(paramVal VARCHAR2) return VARCHAR2; function get_param(paramVal VARCHAR2) return VARCHAR2; end p_view_param; create or replace package body p_view_param is -- Param function set_param(paramVal VARCHAR2) return VARCHAR2 is paramValue VARCHAR2(200); begin paramValue:=paramVal; return paramValue; end; function get_param(paramVal VARCHAR2) return VARCHAR2 is begin --dbms_output.put_line('paramValue'||paramValue); return paramVal; end; END p_view_param; SELECT p_view_param.set_param('sss') as temp FROM dual; SELECT p_view_param.get_param(p_view_param.set_param('sss')) as temp FROM dual;