INSERT시에 현재달부터 월말까지 똑같은데이터를 넣어주는 방법 0 2 1,566

by 달콤꼬야 [PL/SQL] [2017.07.10 10:08:44]


INSERT시에 입력받은 달부터 월말까지 똑같은데이터를 자동으로 넣어주는 방법을 알고싶습니다.

구체적으로 제가 하려는 작업을 설명하자면

 

A라는 테이블에 (SQL, MONTH,....)라는 컬럼이있고 사용자가 파라미터로 (ORACLE, 201708)을 넣어주면

ORACLE, 201708,....

ORACLE, 201709,....

ORACLE, 201710,....

ORACLE, 201711,....

ORACLE, 201712,....

 

이렇게 동일한 데이터를 년도만 다르게 넣어주는 것입니다.

저는 아래와 같은 방법으로 글로벌 템포러리 테이블을 만들어서 INSERT -SELECT 문 사용해서 해결하려고 했는데

더 좋은 방법이 있지 않을까 해서 문의드립니다.

 

참고로 저방법으로하니까

세션문제가 발생해서

ORA-14452: 임시 테이블에 인덱스를 작성, 변경 또는 삭제하려고 하는 것이 이미 사용되었습니다

이러한 오류가 발생하는데 세션을 작업시작전에 정리하고 작업을 진행해야할까요?

 

 

 

DECLARE
        V_DATE  VARCHAR2(8) := '20170710';
        V_CNT   INT(2);
        V_MONTH  VARCHAR2(8) := '20170710';
        i INT(1) := 1;
            
    BEGIN
        SELECT COUNT(*) INTO i FROM ALL_TABLES WHERE TABLE_NAME = 'MONTHLIST';
        IF i > 0
        THEN
            EXECUTE IMMEDIATE 'DROP TABLE MONTHLIST';
        END IF;
        EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE MONTHLIST (MON   VARCHAR2(8))';
        
        SELECT MONTHS_BETWEEN(TO_DATE('201712', 'YYYYMM'), TO_DATE(SUBSTRING(V_DATE,0,6), 'YYYYMM')) INTO V_CNT FROM DUAL;
        INSERT INTO MONTHLIST (MON) VALUES (SUBSTRING(V_DATE, 0, 6));
        
        FOR i IN 1..V_CNT LOOP
            SELECT TO_CHAR(ADD_MONTHS(TO_DATE(V_MONTH, 'YYYYMMDD'),1), 'YYYYMMDD') M INTO V_MONTH FROM DUAL;
            INSERT INTO MONTHLIST (MON) VALUES (SUBSTRING(V_MONTH, 0, 6));
        END LOOP;
    END;

 

by 마농 [2017.07.10 10:45:21]

별도 테이블 없이. PL-SQL 사용 안하고.
그냥 간단하게 쿼리로 가능합니다.
http://www.gurubee.net/article/55635

-- INSERT INTO monthlist (mon)
SELECT TO_CHAR(ADD_MONTHS(sym, LEVEL-1), 'yyyymm') mon
  FROM (SELECT TO_DATE('201707', 'yyyymm') sym
             , TO_DATE('201712', 'yyyymm') eym
          FROM dual)
 CONNECT BY LEVEL <= MONTHS_BETWEEN(eym, sym) + 1
;

 


by 달콤꼬야 [2017.07.10 11:13:35]

정말정말ㅠㅠㅠ정말감사합니다.

항상 많이배웁니다ㅠㅠ

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