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

 

posted @ 2013-12-16 13:03  爱笑的狐狸  阅读(56973)  评论(0编辑  收藏  举报