DATABASE

[ORACLE] 매개변수가 있는 프로시저

오래오래 늘 함께 2018. 12. 3. 16:07


■   매개변수가 있는 프로시저


CREATE OR REPLACE PROCEDURE 프로시저명 ( 매개변수컬럼명  IN 타입형 )

IS

선언


BEGIN


작업


( + 예외처리 )


END;


□   예시


▶▶LOOP문 ( 각 컬럼 선언 )


create or replace procedure p_appart(


m_apgrade IN IV_APPART.apgrade%TYPE   %TYPE : 해당 테이블의 컬럼 타입과 동일하게

)

is

v_apno IV_APPART.APNO%TYPE; 

v_apdiv IV_APPART.APDIV%TYPE;

v_apdept IV_APPART.APDEPT%TYPE;

v_appfield IV_APPART.APPFIELD%TYPE;

v_apgrade IV_APPART.APGRADE%TYPE;


CURSOR 선언


CURSOR p_cursor IS      

select apno, apdiv, apdept, appfield, apgrade from IV_APPART where apgrade = m_apgrade;


begin


OPEN p_cursor;


LOOP


FETCH p_cursor INTO v_apno, v_apdiv, v_apdept, v_appfield, v_apgrade;


EXIT WHEN p_cursor%NOTFOUND; 


%NOTFOUND: 행이 남아 있지 않은 경우 TRUE / 행이 남아 있는 경우 FALSE

                    -> 행이 남아 있지 않은 경우에 LOOP 빠져나온다.


DBMS_OUTPUT.PUT_LINE(v_apno||'==='||v_apdiv||'==='||v_apdept||'==='||v_appfield||'==='||v_apgrade);


END LOOP;


CLOSE p_cursor;


end;


▶▶LOOP문 ( 컬럼 통합 선언 )


create or replace procedure p_appart(


m_apgrade IN IV_APPART.apgrade%TYPE

)

is

DATA IV_APPART%ROWTYPE  %ROWTYPE : 해당 테이블의 컬럼들 타입과 동일하게


CURSOR p_cursor is

select * from IV_APPART where apgrade = m_apgrade;


begin


OPEN p_cursor;


LOOP

FETCH p_cursor INTO DATA;

EXIT WHEN p_cursor%NOTFOUND;

DBMS_OUTPUT.PUT_LINE(DATA.apno||'==='||DATA.apdiv||'==='||DATA.apdept||'==='

||DATA.appfield||'==='||DATA.apgrade);

END LOOP;


CLOSE p_cursor;


end;



▶▶FOR문


create or replace procedure p_appart (


v_apgrade IN IV_APPART.apgrade%TYPE    

)

is

CURSOR p_cursor IS 


select apno, apdiv, apdept, appfield, apgrade from IV_APPART where apgrade = v_apgrade;


begin


FOR p_list IN p_cursor LOOP


DBMS_OUTPUT.PUT_LINE(p_list.apno||'==='||p_list.apdiv||'==='||p_list.apdept||'==='||p_list.appfield||'==='||p_list.apgrade);


END LOOP;


FOR 사용시

커서의 OPEN FETCH CLOSE가 자동발생하며 

레코드의 이름 또한 자동 선언되므로 따로 기술할 필요가 없다.



EXCEPTION 예외처리


when NO_DATA_FOUND then

DBMS_OUTPUT.PUT_LINE('예외처리: 해당 데이터가 없습니다.');


end;