DECLARE 절 문의좀 드립니다 0 10 8,911

by 초보개발자민짱 [MySQL] [2015.07.21 09:01:10]


    DECLARE
        LC_CNT  NUMBER(1);
BEGIN
    LC_CNT := 0;
    SELECT COUNT(*)
    INTO LC_CNT
    FROM SY_HAKGWA_DAMDANGJA_BAEJEONG_M
    WHERE JIGWON_NO= '31998002' ;
    IF LC_CNT > 0 THEN
SELECT DISTINCT
                  A.BUSEO_CD   AS DATA
                , A.BUSEO_NM    AS LABEL
                , A.JOJIK_SORT 
                , A.UP_BUSEO_CD
       FROM SY_BUSEO_M A
       INNER JOIN SY_HAKGWA_DAMDANGJA_BAEJEONG_M B
       ON A.BUSEO_CD = B.DAMDANG_HAKGWA
       WHERE A.BUSEO_LVL = '5'
           AND  A.BUSEO_CD  LIKE 'KH%'
           AND  B.JIGWON_NO= '31998002' 
     ORDER BY JOJIK_SORT ;
     ELSE 
SELECT  DISTINCT
                  A.BUSEO_CD   AS DATA
                , A.BUSEO_NM    AS LABEL
                , A.JOJIK_SORT 
                , A.UP_BUSEO_CD
       FROM SY_BUSEO_M A
       WHERE A.BUSEO_LVL = '5'
           AND  A.BUSEO_CD  LIKE 'KH%'
     ORDER BY JOJIK_SORT ;
     END IF; 
END;       
          
///CNT값이 0보다크면 첫번쨰 쿼리를 타고 그외에는 두번째 쿼리를 타는 쿼리입니다
TOAD에서 돌리니 
ORA-06550: 줄 10, 열1:PLS-00428: 이 SELECT문에는 INTO 절이 필요합니다
ORA-06550: 줄 23, 열1:PLS-00428: 이 SELECT문에는 INTO 절이 필요합니다
이런식으로 오류가 발생합니다 무슨문제일까요?
이


               

 

by jkson [2015.07.21 09:29:26]

말 그대로 프로시저에서 select 문은 항상 into와 함께 사용해야합니다.

declare 아래에 select문에서 조회된 결과를 담을 변수를 선언하시고

select a,b,c
  into wk_val1, wk_val2, wk_val3
  from table
 where ..

이런 식으로 사용하셔야해요.

변수에 담을 수 있는 값은 하나이니 멀티 로우가 select 되면 안 되겠죠.

멀티row를 select하여 처리해야한다면 커서를 사용하시구요.


by 초보개발자민짱 [2015.07.21 09:37:36]
    DECLARE
        LC_CNT  NUMBER(3);
BEGIN
    LC_CNT := 0;
    SELECT COUNT(*)
    INTO LC_CNT
    FROM SY_HAKGWA_DAMDANGJA_BAEJEONG_M
    WHERE JIGWON_NO= '31998002' ;
    IF LC_CNT > 0 THEN
SELECT DISTINCT
                  A.BUSEO_CD   AS DATA
                , A.BUSEO_NM    AS LABEL
                , A.JOJIK_SORT 
                , A.UP_BUSEO_CD 
       INTO LC_CNT           
       FROM SY_BUSEO_M A
       INNER JOIN SY_HAKGWA_DAMDANGJA_BAEJEONG_M B
       ON A.BUSEO_CD = B.DAMDANG_HAKGWA
       WHERE A.BUSEO_LVL = '5'
           AND  A.BUSEO_CD  LIKE 'KH%'
           AND  B.JIGWON_NO= '31998002' 
     ORDER BY JOJIK_SORT ;
     ELSE 
SELECT  DISTINCT
                  A.BUSEO_CD   AS DATA
                , A.BUSEO_NM    AS LABEL
                , A.JOJIK_SORT 
                , A.UP_BUSEO_CD
       INTO LC_CNT         
       FROM SY_BUSEO_M A
       WHERE A.BUSEO_LVL = '5'
           AND  A.BUSEO_CD  LIKE 'KH%'
     ORDER BY JOJIK_SORT ;
     END IF; 
END;       

 

FROM 절위에 INTO 다선언했는데도 오류가 뜨는데 어떻게 해결해야할지 잘모르겟어요 .

 


by 개발뉴비 [2015.07.21 09:45:44]

into절의 변수 갯수와 Select되어 나오는 결과의 컬럼 갯수가 같아야 합니다.

그리고 각 변수에 저장되는 데이터는 jkson님의 말씀처럼 여러행이 될 수 없습니다.


by 초보개발자민짱 [2015.07.21 09:54:24]

이해가 잘안가네요 ㅜㅜ죄송합니다

저는 최초에 SELECT COUNT 값이 0보다 크거나 아닌경우에 쿼리를 조건에 따라 2개를 돌리고 싶은데 그럼 SELECT 문에서는 CNT 값만 받아오면 돼는거 아닌가요 ?


by 창조의날개 [2015.07.21 09:55:10]

DECLARE
        LC_CNT  NUMBER(3);
BEGIN
    LC_CNT := 0;
    SELECT COUNT(*)
    INTO LC_CNT
    FROM SY_HAKGWA_DAMDANGJA_BAEJEONG_M
    WHERE JIGWON_NO= '31998002' ;
    IF LC_CNT > 0 THEN
       SELECT COUNT(*) 
       INTO LC_CNT           
       FROM SY_BUSEO_M A
       INNER JOIN SY_HAKGWA_DAMDANGJA_BAEJEONG_M B
       ON A.BUSEO_CD = B.DAMDANG_HAKGWA
       WHERE A.BUSEO_LVL = '5'
           AND  A.BUSEO_CD  LIKE 'KH%'
           AND  B.JIGWON_NO= '31998002';
     ELSE
       SELECT  COUNT(*)
       INTO LC_CNT         
       FROM SY_BUSEO_M A
       WHERE A.BUSEO_LVL = '5'
           AND  A.BUSEO_CD  LIKE 'KH%';
     END IF; 
END; 

 


by 창조의날개 [2015.07.21 10:08:38]
-- 쿼리로도 가능은 하겠지만 로우수가 많으면 속도가 좋지 않겠네요..


SELECT CASE WHEN SUM(DECODE(JIGWON_NO, '31998002',1,0)) > 0 
            THEN SUM(CASE WHEN A.BUSEO_LVL = '5'
                     AND  A.BUSEO_CD  LIKE 'KH%'
                     AND  B.JIGWON_NO= '31998002' THEN 1 ELSE 0 END)
            ELSE SUM(CASE WHEN A.BUSEO_LVL = '5'
                     AND  A.BUSEO_CD  LIKE 'KH%' THEN 1 ELSE 0 END)
            END AS LC_CNT
FROM SY_BUSEO_M A
     INNER JOIN SY_HAKGWA_DAMDANGJA_BAEJEONG_M B
     ON A.BUSEO_CD = B.DAMDANG_HAKGWA
;

 


by 초보개발자민짱 [2015.07.21 10:13:44]
    DECLARE
        LC_CNT  NUMBER(3);
BEGIN
    LC_CNT := 0;
    SELECT COUNT(*)
    INTO LC_CNT
    FROM SY_HAKGWA_DAMDANGJA_BAEJEONG_M
    WHERE JIGWON_NO= '31998002' ;
    IF LC_CNT > 0 THEN
SELECT DISTINCT
                  A.BUSEO_CD   AS DATA
                , A.BUSEO_NM    AS LABEL
                , A.JOJIK_SORT 
                , A.UP_BUSEO_CD 
       INTO LC_CNT           
       FROM SY_BUSEO_M A
       INNER JOIN SY_HAKGWA_DAMDANGJA_BAEJEONG_M B
       ON A.BUSEO_CD = B.DAMDANG_HAKGWA
       WHERE A.BUSEO_LVL = '5'
           AND  A.BUSEO_CD  LIKE 'KH%'
           AND  B.JIGWON_NO= '31998002'
     ORDER BY JOJIK_SORT ;
     ELSE
SELECT  DISTINCT
                  A.BUSEO_CD   AS DATA
                , A.BUSEO_NM    AS LABEL
                , A.JOJIK_SORT 
                , A.UP_BUSEO_CD
       INTO LC_CNT         
       FROM SY_BUSEO_M A
       WHERE A.BUSEO_LVL = '5'
           AND  A.BUSEO_CD  LIKE 'KH%'
     ORDER BY JOJIK_SORT ;
     END IF; 
END;   

갯수만 들고오는게 아니라 저는 DATA LABEL JOJIK_SORT UP_BUSEO_CD도 같이 들고와야 합니다 .어떻게 방법이 없을까요 ?

 


by jkson [2015.07.21 10:30:07]
DECLARE
        LC_CNT  NUMBER(3);
        WK_BUSEO_CD VARCHAR2(10);
        WK_BUSEO_NM VARCHAR2(100);
        WK_JOJIK_SORT VARCHAR2(10);
        WK_UP_BUSEO_CD VARCHAR2(10);
BEGIN
    LC_CNT := 0;
    SELECT COUNT(*)
    INTO LC_CNT
    FROM SY_HAKGWA_DAMDANGJA_BAEJEONG_M
    WHERE JIGWON_NO= '31998002' ;
    
    BEGIN
    IF LC_CNT > 0 THEN
         SELECT DISTINCT
                      A.BUSEO_CD   AS DATA
                    , A.BUSEO_NM    AS LABEL
                    , A.JOJIK_SORT 
                    , A.UP_BUSEO_CD 
           INTO WK_BUSEO_CD, WK_BUSEO_NM, WK_JOJIK_SORT, WK_UP_BUSEO_CD
           FROM SY_BUSEO_M A
           INNER JOIN SY_HAKGWA_DAMDANGJA_BAEJEONG_M B
           ON A.BUSEO_CD = B.DAMDANG_HAKGWA
           WHERE A.BUSEO_LVL = '5'
               AND  A.BUSEO_CD  LIKE 'KH%'
               AND  B.JIGWON_NO= '31998002'
         ORDER BY JOJIK_SORT ;
     ELSE
         SELECT  DISTINCT
                      A.BUSEO_CD   AS DATA
                    , A.BUSEO_NM    AS LABEL
                    , A.JOJIK_SORT 
                    , A.UP_BUSEO_CD
           INTO WK_BUSEO_CD, WK_BUSEO_NM, WK_JOJIK_SORT, WK_UP_BUSEO_CD        
           FROM SY_BUSEO_M A
           WHERE A.BUSEO_LVL = '5'
               AND  A.BUSEO_CD  LIKE 'KH%'
     ORDER BY JOJIK_SORT ;
     END IF; 
    EXCEPTION
        WHEN OTHERS THEN
            WK_BUSEO_CD := NULL;
            WK_BUSEO_NM := NULL;
            WK_JOJIK_SORT := NULL;
            WK_UP_BUSEO_CD := NULL;
            DBMS_OUTPUT.PUT_LINE('값을 찾을 수 없습니다 : '||SQLERRM);        
    END;
END;   

SELECT 절에 오는 컬럼마다 변수가 지정되어야하구요.

또, SELECT되는 ROW의 수는 항상 1 ROW여야 해요. 담을 수 있는 변수가 VARCHAR형이니까요.

해서 EXCEPTION 절을 썼어요. ORDER BY를 쓰신 거 보니 멀티 ROW가 셀렉트 되는 쿼리일 거

같은데 만약 멀티 ROW가 셀렉트되어야 한다면 커서를 사용하세요.

커서는 찾아서 조금 보시면 아실 겁니다.

 


by 초보개발자민짱 [2015.07.21 10:39:13]

감사합니다 ㅜㅜ대충 감은 오는데 커서 검색해서 한번 사용해봐야할것같습니다.

초보에겐 참힘든 숙제군요 ㅜㅜ


by 겸댕2후니 [2015.07.21 13:35:33]
    SELECT COUNT(*)


    INTO LC_CNT

    FROM SY_HAKGWA_DAMDANGJA_BAEJEONG_M


    WHERE JIGWON_NO= '31998002' ;

   


위의 쿼리도 약간이라도 튜닝하는편이 좋겠네요...


위에 쿼리 실행결과가 단1로우라도 있거나, 0로우거나로 분기되는건데


count(*)로 모든 로우의 갯수를 세는 것은 의미가 없겠지요.


select 1
into LC_CNT
from dual
where exist (select 1 
from SY_HAKGWA_DAMDANGJA_BAEJEONG_M
where JIGWON_NO= '31998002') ;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입