2016-08-16 5 views
1

현재 실행할 쿼리를 결정하기 위해 case 문을 사용하는 저장 프로 시저를 작성하는 중입니다. 내부 쿼리 중 하나는 case 식이며 변경된 프로 시저를 저장하려고 할 때마다 구문 오류가 발생합니다. 프로 시저가 case 표현식 없이는 정상적으로 저장되지만 일단 추가되면 실패합니다. 식 자체의 구문이 정확하다는 것을 알고 있으므로 case식이 case 문 내부에서도 허용되는지 궁금합니다.MySQL - 저장 프로 시저 - Case 문 내부에서 Case 식 사용?

예 :

CASE 
    WHEN x = 1 THEN 
     SELECT 
      5 AS 'Col1', 
      CASE 
       WHEN y = 5 THEN 2 
       ELSE 0 
      END AS 'Col2' 
     FROM table 
     WHERE 1=1 
     ; 
    WHEN x = 2 THEN 
     SELECT 
      * 
     FROM table2 
     ; 
    ELSE 
     SELECT 
      * 
     FROM table3 
     ; 
END CASE; 

어떤 도움을 크게 감상 할 수있다. case 문 안에 case 표현식을 사용할 수 있습니까? 그렇다면 포맷이 다르게 적용됩니까? 이걸 어떻게 작동시킬 수 있니?

감사합니다.

+0

당신은 원하는대로 문장을 중첩 할 수 있지만, 그 점을 반대하십시오. 스파게티 논리의 정의가 대부분이기 때문에. –

+0

당신이하려는 것은 무엇이든, 이것은 당신 시스템의 나쁜 선례로 간주 될 수 있습니다. – Drew

+0

우리는 특정 보고서를 자동화하고 있습니다. 프로 시저에 대한 템플리트 피드에 따라 다른 조회 선택이 사용됩니다. 문법에 문제가 있습니까? 문장 내에 문장을 넣을 수 있다면 구문 오류가 있다고 말하는 이유는 무엇입니까? – WoofDg79

답변

0

MySQL docs에 따르면, CASE 문이 지원됩니다 중첩, 나는 test_proc에 코드를 시도하고 table 그것은 나의 구분이었다

delimiter $$ 
create procedure test_proc() 
begin 
    CASE 
     WHEN x = 1 THEN 
      SELECT 
       5 AS 'Col1', 
       CASE 
        WHEN y = 5 THEN 2 
        ELSE 0 
       END AS 'Col2' 
      FROM table1 
      WHERE 1=1; 
     WHEN x = 2 THEN 
      SELECT 
       * 
      FROM table2 
      ; 
     ELSE 
      SELECT 
       * 
      FROM table3 
      ; 
    END CASE; 
end $$ 
delimiter ; 
+0

흠 매우 흥미 롭습니다. 내 프로 시저가 구문 오류를 던지는 이유를 알고 있습니까? 그것은 나를 위해 컴파일하는 데 실패합니다. 편집자 일 수도 있습니다. – WoofDg79

+0

발견! 내 구분 기호는 여전히 세미콜론으로 설정되었습니다. 일단 $$로 변경하면 완벽하게 작동합니다. 고맙습니다! – WoofDg79

+0

좋아요, 이제이 질문을 닫을 수 있습니다 ... 안부 :) –

0

이기 때문에 변경할 것을 유일한 것은 table1table이다, 작동 . 일반 절차의 구분 기호를 세미콜론 이외의 다른 것으로 변경하고 결국 다시 변경하면 모든 것이 올바르게 작동합니다.