PLS-00231 для функции, определенной в процедуре - PullRequest
1 голос
/ 06 марта 2012

Я посмотрел на проблему, но не нашел решения. моя проблема заключается в следующем

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;

компилятор говорит, что я не могу использовать IS_MASK_ALLOWED в инструкциях SQL

ORACLE 10 г PL / SQL developer 7.5

Ответы [ 2 ]

3 голосов
/ 06 марта 2012

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 true

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
0 голосов
/ 06 марта 2012

Вам нужно поместить свою функцию is_mask_allowed в пакет, чтобы использовать ее в SQL, и вы должны вернуть что-то отличное от логического (возможно, число) из функции и проверить это, так что ваш SQL будет похож на:

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

Вот недавнее обсуждение на форумах Oracle по той же ошибке:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...