ORA-06575:程序包或函數處於無效狀態


今天一個朋友問我下面這段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;
View Code

執行時發現錯誤:

這段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;
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM