2011-03-10 3 views
13

오라클 11g을 사용하고 있으며 문제가있는 곳에서 기울이지 않습니다. 내가 훨씬 더 어려운 물건을 만들었하지만 지난 5 시간 동안이 간단한 일이 실패 :부울을 반환하는 함수가 "식의 형식이 잘못되었습니다."오류가 발생합니다.

이 함수 본문

FUNCTION legal_user(
    level_existance number 
    ,types_with_impel number) 
RETURN BOOLEAN 
IS 
v_ret_val BOOLEAN; 
BEGIN 
    v_ret_val := FALSE; 
    IF (level_existance*types_with_impel>0) then 
    v_ret_val := TRUE; 
    DBMS_OUTPUT.PUT_LINE('true'); 
    else 
    DBMS_OUTPUT.PUT_LINE('false'); 
    END IF;  
    return v_ret_val; 
END legal_user; 

이에게 사양입니다 :

FUNCTION legal_user(
     level_existance number 
     ,types_with_impel number) 
    RETURN BOOLEAN; 

하는 논리 값이 같고 같음

  A*B>0?true:false; 

오류 메시지 "%의 PL/SQL" * 원인 :
* - PL/SQL : 문 무시 ORA-06553 : PLS-382 표현이 잘못된 형식의 06552. 00000입니다

ORA-06552되어지고 라인에서 오류 : 조치 1 개 칼럼 : 7


이것은 내가

SELECT compt_tree_profile_q.legal_user(1,1) 
FROM dual 
+0

나는이 함수를 컴파일하고 사용했고 효과가 있었다. 어떻게 사용하고 있는지에 대한 예제 코드를 추가 할 수 있습니까? –

+0

코드가 –

답변

23

Pure SQL은 부울 유형을 인식하지 않지만 PL/SQL은 부울 유형을 인식하지 못합니다. 그래서 쿼리는

기능은 어떤 작품 데이터 형식이 기능이 반환 .. 모르는, 그래서 당신은 다른 PL/SQL 블록을 사용

declare 
myvar boolean; 
begin 
    myvar := compt_tree_profile_q.legal_user(1,1); 
end; 

에서와 수도 있지만 당신은 순수에서이 기능을 사용할 수 없습니다 select 문.

+0

에 추가되었습니다. 덕분에 나는 더 이상 사무실에 없기 때문에 일요일 아침에 –

+0

yoav에서 확인했습니다. SQL 구문에서이 기능을 계속 사용하려면 (필요로하는 경우) 대신 숫자를 반환해야합니다. boolean (1 = true, 0-false). 그런 다음 이중에서 legal_user (1,1)를 선택할 수 있으며 결과를 해석하는 방법을 알아야합니다. –

17

함수는 부울을 반환 내 IDE에서 실행하는 방법입니다. 이 데이터 유형은 PL/SQL에 알려져 있지만 SQL 쿼리를 사용하고 있습니다. SQL은 부울을 처리하는 방법을 알지 못하고 "expression is wrong type"이라고 말합니다.

감사합니다.
Rob.

1

SQL 내에서 이것을 호출하면 자신의 롤링 대신 내장 된 SIGN 함수를 사용할 수 있습니다.

이 함수는 매개 변수의 부호 (각각 음수, 0 또는 양수)에 따라 -1, 0 또는 1을 반환합니다.

SIGN(level_existance*types_with_impel) 

을 그리고 당신이 CASE 문에 그것을 어떻게 작동하는지 :

SELECT CASE WHEN (SIGN(level_existance*types_with_impel) = 1) 
      THEN 'TRUE' 
      ELSE 'FALSE' 
     END legal_user 
FROM ... 

이 경우, 난 그냥 문자열을 반환하고있어 ('TRUE에게 여기

당신이 그것을 사용하는 것이 방법 '또는'FALSE ')하지만 SELECT 문 (열, SYSDATE 등) 내에서 유효한 모든 것을 반환 할 수 있습니다.

관련 문제