[함수] IF ELSE 문 에러가 뭔지 모르겠습니다. 0 5 2,857

by Vampirejk [PL/SQL] [2013.06.09 11:03:29]


<pre class="brush:sql;"> 
CREATE OR REPLACE FUNCTION RMSPTC."FC_GET_RNUMBER_NO"(P_GUBUN INTEGER)
RETURN VARCHAR2 
IS
 V_RNUMBER  VARCHAR2(10);
 
BEGIN
    
    IF P_GUBUN = 1 THEN
           SELECT 'R'||TO_CHAR(SYSDATE, 'YYMMDD')||LPAD(TO_NUMBER(SUBSTR(R_NUMBERING,8,3))+ 1, 3, '0')
           INTO  V_RNUMBER
           FROM (
                  SELECT R_NUMBERING,  RANK() OVER(ORDER BY R_NUMBERING DESC) AS NUM 
                  FROM IF_RMS_ERP_TTM     
                 )
           WHERE NUM = 1;
           
           IF V_RNUMBER IS NULL THEN
              V_RNUMBER := 'R'||TO_CHAR(SYSDATE, 'YYMMDD')||'001';
           END IF;
           DBMS_OUTPUT.PUT_LINE(V_RNUMBER); 
           
           RETURN V_RNUMBER;
           
    ELSE IF  P_GUBUN = 2 THEN
           SELECT 'R'||TO_CHAR(SYSDATE, 'YYMMDD')||LPAD(TO_NUMBER(SUBSTR(R_NUMBERING,8,3))+ 1, 3, '0')
           INTO  V_RNUMBER
           FROM (
                  SELECT R_NUMBERING,  RANK() OVER(ORDER BY R_NUMBERING DESC) AS NUM 
                  FROM IF_RMS_ERP_RTM     
                 )
           WHERE NUM = 1;
           
           IF V_RNUMBER IS NULL THEN
              V_RNUMBER := 'R'||TO_CHAR(SYSDATE, 'YYMMDD')||'001';
           END IF;
           DBMS_OUTPUT.PUT_LINE(V_RNUMBER); 
           
           RETURN V_RNUMBER;
           
    ELSE IF  P_GUBUN = 3 THEN
           SELECT 'R'||TO_CHAR(SYSDATE, 'YYMMDD')||LPAD(TO_NUMBER(SUBSTR(R_NUMBERING,8,3))+ 1, 3, '0')
           INTO  V_RNUMBER
           FROM (
                  SELECT R_NUMBERING,  RANK() OVER(ORDER BY R_NUMBERING DESC) AS NUM 
                  FROM IF_RMS_ERP_FIXTM     
                 )
           WHERE NUM = 1;
           
           IF V_RNUMBER IS NULL THEN
              V_RNUMBER := 'R'||TO_CHAR(SYSDATE, 'YYMMDD')||'001';
           END IF;
           DBMS_OUTPUT.PUT_LINE(V_RNUMBER); 
           
           RETURN V_RNUMBER;
    ELSE

     V_RNUMBER := 'R'||TO_CHAR(SYSDATE, 'YYMMDD')||'ERR';
     RETURN  V_RNUMBER;
     
    END IF;
 
END FC_GET_RNUMBER_NO;
/     </pre> 
by Vampirejk [2013.06.09 11:13:23]
oracle 은 elsif군요 ;;
ㅠㅠ
c++, mfc만 익숙해서 ㅋ

by 아린 [2013.06.09 14:46:41]
위 함수는 당일 채번하는 함수 같은데요. 
순번이 연속적으로 나오지는 않을 듯합니다.


6/8일 마지막채번번호 003 => R130608003
6/9일 첫번째채번번호        R130609004 (X)  이 나옴
                         R130609001 (O)  이 나와야됨     

-- 현재 있는 sql  
WITH t(r_numbering) AS(
SELECT 'R130608001' FROM dual UNION ALL
SELECT 'R130608002' FROM dual UNION ALL
SELECT 'R130608003' FROM dual
)
SELECT 'R'||TO_CHAR(SYSDATE, 'YYMMDD')
          ||LPAD(TO_NUMBER(SUBSTR(R_NUMBERING,8,3))+ 1, 3, '0') R_NUMBERING
  FROM (SELECT R_NUMBERING,  RANK() OVER(ORDER BY R_NUMBERING DESC) AS NUM 
          FROM t     
        )
 WHERE NUM = 1


-- 수정 sql
SELECT 'R'||TO_CHAR(SYSDATE,'yymmdd')||
       NVL(LPAD(SUBSTR(MAX(r_numbering),8)+1,3,'0'),'001') r_numbering
  FROM t
 WHERE r_numbering LIKE 'R'||TO_CHAR(SYSDATE,'yymmdd')||'%'

-- r_numbering 인덱스가 있다면.
SELECT /*+INDEX_DESC(t idx01_t) */
       'R'||TO_CHAR(SYSDATE,'yymmdd')||
       NVL(LPAD(SUBSTR(MAX(r_numbering),8)+1,3,'0'),'001') r_numbering
  FROM t  
 WHERE r_numbering LIKE 'R'||TO_CHAR(SYSDATE,'yymmdd')||'%'
   AND ROWNUM = 1

by Vampirejk [2013.06.13 15:14:44]
아린님 감사합니다.

말씀주신대로 당일 채번은 맞지만 다음 일이라고해서 001로 다시 시작은 하지 않아도 되는 케이스예요

R20130601001
R20130602002 
...
..
.
이런 식으로 증가해도 괜찮습니다 

좋은 답변 감사드립니다.

by 부쉬맨 [2013.06.10 09:45:31]
그냥
if 
begin
end;
로쓰면 저렇게 쓸수도있슴 준기상

by Vampirejk [2013.06.14 10:58:30]
아리가또!
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입