PLS-00231用于程序定义的功能

时间:2012-03-06 15:39:40

标签: oracle plsql oracle10g

我查了解问题,但没有找到解决方案。我的问题如下

create or replace procedure GETINFO(
    pIVR OUT NUMBER
) IS
      FUNCTION IS_MASK_ALLOWED(
                pBusSeg IN NUMBER,
                pCHTPMask IN NUMBER
       )
       RETURN BOOLEAN
       IS
       BEGIN
             IF pCHTPMask > 0 THEN    
             ELSE RETURN TRUE;
             END IF;

       END;
BEGIN

      SELECT 1
      INTO pIVR 
      FROM DUAL
      WHERE IS_MASK_ALLOWED(1, 2)=TRUE;

END;

编译器说我不能在SQL语句中使用IS_MASK_ALLOWED

ORACLE 10g PL / SQL开发人员7.5

2 个答案:

答案 0 :(得分:3)

Oracle不支持SQL中的布尔语句,因此使用True将无效。请尝试select 1 from dual where True = True进行确认。

其次,如果您不允许任何人在您的程序之外访问is_mask_allowed,那就完成了这一切,那么您可以执行此操作pIVR := 1。这将与您的代码(过程和函数)具有相同的结果。就个人而言,如果这是他们所做的一切,我会在同一程序中拥有一切。

如果您遗漏了is_mask_missing中的某些信息,then之后没有任何信息,那么您的套餐会因no_data_found而错误,因为select 1 from dual where 1 = 0可能,什么都不返回。

如果您希望在程序之外访问is_mask_allowed,最简单的方法是将其放入包中。因为你不能使用布尔值我使用了二进制文件,其中0表示false而1表示

create or replace package my_package is

   function is_mask_allowed ( pBusSeg IN NUMBER
                            , pCHTPMask IN NUMBER
                            )  RETURN NUMBER;

   procedure get_info ( pIVR out NUMBER );

end my_package;
/
show error

create or replace package body my_package is

   function is_mask_allowed ( pBusSeg IN NUMBER
                            , pCHTPMask IN NUMBER
                            )  RETURN NUMBER is

   begin

      if pCHTPMask > 0 THEN
         -- do something
         return 0
      else return 1
      end if;

   end is_mask_allowed;

  -----------------------------------

   procedure getinfo( pIVR OUT NUMBER ) IS

   begin

       if is_mask_allowed(1,2) = 1 then
          pIVR := 1;
       else
          pIVR := -- something else;
       end if;

   end getinfo;

end my_package;
/
show error

答案 1 :(得分:0)

你需要将你的is_mask_allowed函数放入一个包中以便在SQL中使用它,你应该从函数中返回一个除布尔值(可能是一个数字)以外的东西并测试它,所以你的SQL更像是: / p>

select my_pkg.is_mask_allowed(1, 2) into pIVR from dual;

以下是Oracle论坛中关于同一错误的最新讨论:

https://forums.oracle.com/forums/thread.jspa?threadID=2319500