PL/SQL 고수님들 도와주세여..... 1

by 용녀 [PL/SQL] [2023.10.19 15:24:01]


--오라클 펑션

CREATE OR REPLACE FUNCTION TEST2 (as_gu VARCHAR2)
RETURN NUMBER IS

AMT_1 NUMBER(13);
AMT_2 NUMBER(13);
AMT_3 NUMBER(13);
AMT_4 NUMBER(13);
AMT_5 NUMBER(13);


BEGIN

   AMT_1 := 1;
   AMT_2 := 2;
   AMT_3 := 3;
   AMT_4 := 4;
   AMT_5 := 5;

   IF    as_gu = 'AMT_1' THEN RETURN AMT_1 ;
   ELSIF as_gu = 'AMT_2' THEN RETURN AMT_2 ;
   ELSIF as_gu = 'AMT_3' THEN RETURN AMT_3 ;
   ELSIF as_gu = 'AMT_4' THEN RETURN AMT_4 ;
   ELSIF as_gu = 'AMT_5' THEN RETURN AMT_5 ;
   END IF;   

END;

 

위와 같은 펑션에서요,,

   IF    as_gu = 'AMT_1' THEN RETURN AMT_1 ;
   ELSIF as_gu = 'AMT_2' THEN RETURN AMT_2 ;
   ELSIF as_gu = 'AMT_3' THEN RETURN AMT_3 ;
   ELSIF as_gu = 'AMT_4' THEN RETURN AMT_4 ;
   ELSIF as_gu = 'AMT_5' THEN RETURN AMT_5 ;
   END IF;   

위 부분을 동적으로 수정이 가능할까요??

위 예시문에서는 5개가 전부이지만 실제로는 20개가 넘어 가는데

불필요한 하드코딩을 줄여 보고싶어서요~

고수님들의 고견을 기다리겠습니다!

by 마농 [2023.10.19 23:17:31]
-- 코드테이블로 별도 관리하는 방안이 좋을 듯 합니다.

-- 1. 코드 테이블 생성
CREATE TABLE code_test
(gu  VARCHAR2(10) PRIMARY KEY, amt NUMBER(13))
;

-- 2. 코드 값 입력
INSERT INTO code_t VALUES('AMT_1', 1);
INSERT INTO code_t VALUES('AMT_2', 2);
INSERT INTO code_t VALUES('AMT_3', 3);
INSERT INTO code_t VALUES('AMT_4', 4);
INSERT INTO code_t VALUES('AMT_5', 5);
COMMIT;

-- 3. 코드테이블 이용하는 함수
CREATE OR REPLACE FUNCTION test2(as_gu VARCHAR2)
RETURN NUMBER
IS
    v_amt NUMBER(13);
BEGIN
    BEGIN
        SELECT amt
          INTO v_amt
          FROM code_test
         WHERE gu = as_gu
        ;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            v_amt := 0;
    END;
    RETURN v_amt;
END;
/

 


by 용녀 [2023.10.20 08:43:07]

우선 답변 너무 감사드립니다..!

제가 소스를 너무 많이 줄이는 바람에 의도가 잘못 전달 된 듯 합니다..

 

BEGIN
 
   AMT_01 := (계산식에 의한 계산결과값01) ;
   AMT_02 := (계산식에 의한 계산결과값02) ;
   AMT_03 := (계산식에 의한 계산결과값03) ;
   AMT_04 := (계산식에 의한 계산결과값04) ;
   AMT_05 := (계산식에 의한 계산결과값05) ;
   AMT_06 := (계산식에 의한 계산결과값06) ;
   AMT_07 := (계산식에 의한 계산결과값07) ;
   AMT_08 := (계산식에 의한 계산결과값08) ;
   AMT_09 := (계산식에 의한 계산결과값09) ;
   AMT_10 := (계산식에 의한 계산결과값10) ;
   AMT_11 := (계산식에 의한 계산결과값11) ;
   AMT_12 := (계산식에 의한 계산결과값12) ;
   AMT_13 := (계산식에 의한 계산결과값13) ;
   AMT_14 := (계산식에 의한 계산결과값14) ;
   AMT_15 := (계산식에 의한 계산결과값15) ;
   AMT_16 := (계산식에 의한 계산결과값16) ;
   AMT_17 := (계산식에 의한 계산결과값17) ;
   AMT_18 := (계산식에 의한 계산결과값18) ;
   AMT_19 := (계산식에 의한 계산결과값19) ;
   AMT_20 := (계산식에 의한 계산결과값20) ;
 
   IF    as_gu = 'AMT_01' THEN RETURN AMT_01 ;
   ELSIF as_gu = 'AMT_02' THEN RETURN AMT_02 ;
   ELSIF as_gu = 'AMT_03' THEN RETURN AMT_03 ;
   ELSIF as_gu = 'AMT_04' THEN RETURN AMT_04 ;
   ELSIF as_gu = 'AMT_05' THEN RETURN AMT_05 ;
   ELSIF as_gu = 'AMT_06' THEN RETURN AMT_06 ;
   ELSIF as_gu = 'AMT_07' THEN RETURN AMT_07 ;
   ELSIF as_gu = 'AMT_08' THEN RETURN AMT_08 ;
   ELSIF as_gu = 'AMT_09' THEN RETURN AMT_09 ;
   ELSIF as_gu = 'AMT_10' THEN RETURN AMT_10 ;
   ELSIF as_gu = 'AMT_11' THEN RETURN AMT_11 ;
   ELSIF as_gu = 'AMT_12' THEN RETURN AMT_12 ;
   ELSIF as_gu = 'AMT_13' THEN RETURN AMT_13 ;
   ELSIF as_gu = 'AMT_14' THEN RETURN AMT_14 ;
   ELSIF as_gu = 'AMT_15' THEN RETURN AMT_15 ;
   ELSIF as_gu = 'AMT_16' THEN RETURN AMT_16 ;
   ELSIF as_gu = 'AMT_17' THEN RETURN AMT_17 ;
   ELSIF as_gu = 'AMT_18' THEN RETURN AMT_18 ;
   ELSIF as_gu = 'AMT_19' THEN RETURN AMT_19 ;
   ELSIF as_gu = 'AMT_20' THEN RETURN AMT_20 ;
   END IF;
 
END;

 

이런식으로 구성 됐을 경우,,

받은 구분값의 텍스트를 변수로 인식 시켜서 리턴 하고 싶은데 방법이 없을까요..

그냥 저런식으로 일일이 다 적어주는 방법이 최선인건지가 궁금합니다..!

 

감사합니다!

 

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