2011-11-09 2 views
2

프로 시저의 WHERE 절에서 IF/ELSE를 수행하려고하는데 작업이 올바르게 수행되지 않습니다. 내가 제대로 구성하고 있는지 확실하지 않습니다.PL/SQL : ORA-00933 : SQL 명령이 제대로 종료되지 않았습니다.

나는 PL/SQL을 얻을 : ORA-00933 : SQL 명령이 제대로에 종료되지 "p_job_year가 NULL가 아닌 경우,"

이 내가있어 무엇 :

WHERE 
    (val1s.val1 = p_val1 OR p_val1 IS NULL) AND 
    (UPPER(val2s.val2) LIKE UPPER(p_val2) OR p_val2 IS NULL) AND 
    (jp.row_top.job_type_id = p_job_type_id OR p_job_type_id IS NULL) 

    AND ntab.group_id = pgds.id(+) 
    AND jp.row_top.val1_id = val1s.id(+) 
    AND val1s.val2_id = val2s.id(+) 

IF p_job_year IS NOT NULL THEN <<<<<<<< ERROR HERE 
      AND p_job_year = ntab.fiscal_year(+) 
      AND jp.jobload_year = p_job_year 
      AND jp.row_top.fiscal_year = p_job_year 
    ELSE 
     AND jp.jobload_year < TO_CHAR(ADD_MONTHS(CURRENT_DATE, -24),'YYYY') 
     AND jp.row_top.fiscal_year < TO_CHAR(ADD_MONTHS(CURRENT_DATE, -24),'YYYY') 


END IF; 

    AND JP.VER = (select MAX(jp2.ver) from job_plans jp2 
                WHERE JP.ID_NUMBER = JP2.ID_NUMBER) 
    AND jack_work_pkg.get_last_jack_work_first_type(jp.id) != 1;             
      RETURN result_cur; 
    END summarize_work_data; 

답변

3

당신이 할 수있는 ' 그런 식으로 IF 절을 사용하면 where 절을 약간 다르게 구성해야합니다.

AND 
(
    (
     p_job_year IS NULL 
     AND jp.jobload_year < TO_CHAR(ADD_MONTHS(CURRENT_DATE, -24),'YYYY')   
     AND jp.row_top.fiscal_year < TO_CHAR(ADD_MONTHS(CURRENT_DATE, -24),'YYYY') 
    ) 
    OR 
    (
     p_job_year is not NULL 
     AND p_job_year = ntab.fiscal_year(+)    
     AND jp.jobload_year = p_job_year    
     AND jp.row_top.fiscal_year = p_job_year 
    ) 
) 
+0

안녕하세요. 감사합니다 ... 약을 주려고합니다. –

+0

감사합니다. ... 작동했습니다. –

0

IF/ELSE/END IF를 WHERE 절에 쓸 수 있다고 생각합니까?

AND (
    (p_job_year IS NOT NULL AND (
      AND p_job_year = ntab.fiscal_year(+) 
      AND jp.jobload_year = p_job_year 
      AND jp.row_top.fiscal_year = p_job_year)) 
    OR (p_job_year IS NULL AND (
     AND jp.jobload_year < TO_CHAR(ADD_MONTHS(CURRENT_DATE, -24),'YYYY') 
     AND jp.row_top.fiscal_year < TO_CHAR(ADD_MONTHS(CURRENT_DATE, -24),'YYYY'))) 
) 
+0

안녕하세요. SQL에 대한 의식이 살아있는 ... 프런트 엔드 jJAVA를 작성하고 ... 때때로 SQL을 수정해야합니다 ... 나는 잘못 생각했기 때문에 ... 똑똑한 의견이 필요합니다. –

+0

야, 나 돈이 없어. 그래서 생계를 위해 질문에 대답하지 않습니다 ... 나는 당신을 도우려고하기 때문에, 그리고 때로는 그것에서 유용하고 무언가를 배우기 때문에 즐겁게 대답합니다. 왜냐하면 제가 점을 수집하기 때문입니다. :) 그럼, 유용한 답변을 찾으면, upvote하시기 바랍니다. – bpgergo

+0

도움을 주셔서 감사합니다 ... 죄책감은 없지만 글자 그대로 읽었습니다 ... 내 얼굴에 대해 이렇게 말하면 "WHERE 절에 IF/ELSE/END IF를 작성할 수 있다고 생각하게 만드는 이유는 무엇입니까?" 나는 똑같은 방식으로 대답했을거야 .... 어느 쪽이든 감사합니다 –

-1

글쎄, 당신이 생각하는 것처럼 간단하지 : 당신은 WHERE 절에 추가 할 수 있습니다 기본적으로 어떤

이 같은 것입니다. 이런 방식으로 동적 쿼리를 생성 할 수 없습니다. 옵션은 쿼리를 문자열로 만들고 execute immediate을 사용하여 쿼리를 실행하는 것입니다.

0

이 전체 블록이 단지 where 절이라고 가정합니다. 이 경우 where 절에서 "IF..ELSE"를 사용할 수 없습니다. 대신 필요에 따라 this..just 사용하여 AND 및 OR 괄호처럼 쿼리를 다시 작성

Where condition1 
    and condition2 
    and IF Condition3 then 
     AND condition4... 
     ELSE 
      condition5 
    and <.....> 
를 사용

Where condition1 
    and condition2 
    and ((Condition3 and condition4) or (condition5)) 
    and <.....> 
+0

고마워요 친구 ... 많이 감사합니다. –

0

이 THEN ELSE WHERE 절, 안쪽 IF 아니오 -하지만, 필요한 경우 CASE WHEN THEN ELSE을 사용하여 보완 할 수 있습니다.

관련 문제