ORA-06575:程序包或函数处于无效状态

本文讨论了一个朋友在使用Oracle SQL时遇到的ORA-06575错误,指出将编程思维应用于数据库包的常见误区。强调了参数命名避免使用特殊词汇,函数之间的独立性,以及包和包体应分开创建的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天一个朋友问我下面这段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

 

转载于:https://www.cnblogs.com/zhutouying/p/3476557.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值