Oracle PL/SQL의 User Function에서 Boolean Return

Oracle 2010. 9. 10. 16:09
어떤 분이 질문을 하셔서 답변을 정리하여 올립니다.

Q> User Function으로 Boolean이 반환되는 것을 하나 만들었습니다.

     이 Function을 SELECT구문에서 직접 사용하고 싶은데 안됩니다. 이를 해결할 수 있는 방법이 없을까요?

A> 먼저 결론부터 알려드린다면, "없습니다."
 
     아래와 같이 예시를 위해서 Function을 생성하고, 이 Function을 호출해봅니다.

      -- Boolean값을 반환하는 Function을 하나 생성합니다.
      create or replace
      function test_boolean ( p_val in number ) return boolean is
      begin
            if p_val > 1 then
                 return TRUE;
            else
                 return FALSE;
            end if;
      end;  
     /

     -- Boolean 값을 반환하는 Function을 SELECT구문에서 사용해봅니다.
      select test_boolean(1) from dual;


     위와 같이 실행해보면 아래와 같은 Oracle Error Message를 접하시게 됩니다. 
     ORA-06552: PL/SQL: Statement ignored
     ORA-06553: PLS-382: 식이 잘못된 유형입니다
           

SELECT문에서는 Boolean을 반환하는 Function 자체를 아예 인지하는 못하는듯한 메세지가 나타납니다.

이에 대한 방법이 있을까 하여, Ask Tom Site를 찾아보았습니다.

많은 논쟁이 있었지만, 아래의 답변으로 정리는 될듯 합니다.

사용자 삽입 이미지
모든 내용을 보시려면 아래 URL로 가서 확인해보시기 바랍니다.
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:6263249199595


결론적으로, Function의 Return값으로 Boolean을 사용하기 보다는, Number or Character Type으로 변환시켜서

Return하도록 하는 것이 바람직하다 하겠습니다.

 -- 원천적으로 Boolean을 반환하는 Function을 수정하는 방법
      create or replace
      function test_boolean ( p_val in number ) return number is
      begin
            -- 0보다 큰 값을 True로 인지 (이 부분의 Logic은 원하는 대로 코딩하시면 될듯)
            if p_val > 0 then
                 return 1;
            else
                 return 0;
            end if;
      end;  
     /

  -- 기존에 존재하는 Boolean을 반환하는 Function을 다른 Function에서 호출하도록 우회하는 방법
      create or replace
      function test_character ( p_val in number ) return varchar2 is
      begin
            if test_boolean(1) = true then
                 return 'TRUE';
            else
                 return 'FALSE';
            end if;
      end;  
     /
:     

TISTORY에 Login하려면 여기를 누르세요.