Notice
Recent Posts
Recent Comments
관리 메뉴

안까먹을라고 쓰는 블로그

[SQL Query] Cursor 본문

DataBase

[SQL Query] Cursor

YawnsDuzin 2022. 1. 7. 09:21

 

반응형

Sales 테이블을 참조하여, 아래의 조건을 추가 한후,  Sales2에 데이터를 입력하시오

이전 연도가 없을 경우 : NULL
이전 연도보다 매출이 올랐을 경우 : +
이전 연도보다 매출이 내렸을 경우 : -
이전 연도와 매출이 동일한 경우 : =


Sales 테이블

company(회사) year(연도) sale(매상 : 억)
A 2002 50
A 2003 50
A 2004 55
A 2007 55
B 2001 27
B 2005 28
B 2006 28
B 2009 30
C 2001 40
C 2005 39
C 2006 38
C 2010 35

 

커서를 이용한 쿼리

CREATE OR REPLACE PROCEDURE PROC_INSERT_VAR
IS

	/* 커서 선언 */
    CURSOR c_sales IS
    	SELECT company, year, sale
        FROM Sales
        ORDER BY company, year;
        
	/* 레코드 타입 선언 */
    rec_sales c_sales%ROWTYPE;
    
    /* 카운터 */
    i_pre_sale INTEGER := 0;
    c_company CHAR(1) := '*';
    c_var CHAR(1) := '*';
    
BEGIN

OPEN c_sales;
	LOOP
    /* 레코드를 패치해서 변수에 대입 */
    fetch c_sales into rec_sales;
    /* 레코드가 없다면 반복을 종료 */
    exit when c_sales%notfound;
    
    IF (c_company = rec_sales.company) THEN
    	/* 직전 레코드가 같은 회사의 레코드 일때 */
        /* 직전 레코드와 매상을 비교 */
        IF (i_pre_sale < rec_sales.sale) THEN
        	c_var := '+';
		ELSIF (i_pre_sale > rec_sales.sale) THEN
        	c_var := '-';
		ELSE
        	c_var := '=';
		ENDIF;
	ELSE
    	c_var := NULL;
	ENDIF;
    
	    /* 등록 대상이 테이블에 테이블을 등록 */
    	INSERT INTO Sales2 (company, year, sale, var)
    		VALUES (rec_sales.company, rec_sales.year, rec_sales.sale, c_var);
        
		c_company := rec_sales.company;
    	i_pre_sale := rec_sales.sale;
    
    END LOOP;
    
    CLOSE c_sales;
    commit;
END;


결과값 - Sales2 테이블

company(회사) year(연도) sale(매상 : 억) var(변화)
A 2002 50  
A 2003 50 +
A 2004 55 +
A 2007 55 =
B 2001 27  
B 2005 28 +
B 2006 28 =
B 2009 30 +
C 2001 40  
C 2005 39 -
C 2006 38 -
C 2010 35 -

 

반응형
Comments