Oracle
Oracle PL/SQL의 User Function에서 Boolean Return
david2kim
2010. 9. 10. 16:09
어떤 분이 질문을 하셔서 답변을 정리하여 올립니다.
Q> User Function으로 Boolean이 반환되는 것을 하나 만들었습니다.
이 Function을 SELECT구문에서 직접 사용하고 싶은데 안됩니다. 이를 해결할 수 있는 방법이 없을까요?
A> 먼저 결론부터 알려드린다면, "없습니다."
아래와 같이 예시를 위해서 Function을 생성하고, 이 Function을 호출해봅니다.
위와 같이 실행해보면 아래와 같은 Oracle Error Message를 접하시게 됩니다.
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하도록 하는 것이 바람직하다 하겠습니다.
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;
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: 식이 잘못된 유형입니다
ORA-06553: PLS-382: 식이 잘못된 유형입니다
SELECT문에서는 Boolean을 반환하는 Function 자체를 아예 인지하는 못하는듯한 메세지가 나타납니다.
이에 대한 방법이 있을까 하여, Ask Tom Site를 찾아보았습니다.
많은 논쟁이 있었지만, 아래의 답변으로 정리는 될듯 합니다.
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;
/
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;
/