본문 바로가기

Study/Oracle

[oracle] PROCEDURE

*commit  것은 rollback   없다그래서 기존 테이블 외에 백업 테이블을 만들어 둔다.

*procedure 만들기

pyong_info  평형별 금액을 기준으로 각호의 가격을 산정하는 프로시져 작성.

1. 층이 전체 층의 60%이상 85% 이하인 층들의 가격을 20%상승

2. 향이 남향이면 10%상승동향이면 5%상승북향 -5%, 서향 0% 상승.

3. 파라메터로 apt_code  입력받아 해당 아파트만 업데이트 될수 있도록...

4. apt_code 별로 업데이트 하지말고, dong_code 별로 업데이트.

 

CREATE OR REPLACE PROCEDURE SCOTT.chap09 (

    l_apt_code number

)

IS

    v_max_floor number(11) default 0;

    v_price number(11) default 0;

BEGIN

    FOR v_list IN (

        SELECT h.apt_code, h.dong_code, h.ho_code,  h.floor,  h.direction, p.pyong_code,  p.pyong_price

        FROM ho_info h, pyong_info p

        WHERE p.pyong_code = h.pyong

        AND h.apt_code = l_apt_code

    ) LOOP

   

        SELECT d.ho_count

        INTO v_max_floor

        FROM dong_info d

        WHERE d.apt_code = v_list.apt_code

        AND d.dong_code = v_list.dong_code;

       

        IF v_list.floor >= v_max_floor * 0.6 AND v_list.floor <= v_max_floor * 0.85 THEN

            v_price := v_list.pyong_price * 1.2;

        ELSE

            v_price := v_list.pyong_price;

        END IF;

       

        IF v_list.direction = 1 THEN

            v_price := v_price * 1.05;

        ELSIF v_list.direction = 2 THEN

            v_price := v_price;

        ELSIF v_list.direction = 3 THEN

            v_price := v_price * 1.1;

        ELSIF v_list.direction = 4 THEN

            v_price := v_price - (v_price * 0.05);

        END IF;

 

        UPDATE ho_info h

        SET h.price = v_price

        WHERE h.apt_code = v_list.apt_code

        AND h.dong_code = v_list.dong_code

        AND h.ho_code = v_list.ho_code;

       

    END LOOP;

END chap09;

/

 

*dong_code  상관없이 가격변동

CREATE OR REPLACE PROCEDURE SCOTT.chap09 (

    l_apt_code number

)

IS

BEGIN

   

    UPDATE ho_info h set price = (

        SELECT pi.pyong_price+(pi.pyong_price*0.2)

        FROM pyong_info pi

        WHERE h.apt_code = l_apt_code AND pi.pyong_code = h.pyong

    ) WHERE (

        h.floor >= (select max(floor)*0.6 from ho_info where h.apt_code =  l_apt_code)

        AND

        h.floor <= (select max(floor)-(max(floor) * 0.15) from ho_info where h.apt_code =  l_apt_code)

    )

END chap09;

/