PL/SQL 프로시저 IN & OUT


매개변수 디폴트값 설정
-- 매개변수 디폴트 값 설정
EXECUTE MY_NEW_PROC('SM_JOB1', 'SAMPLE JOB1'); -- 에러. 매개변수 4개인데 값은 2개

CREATE OR REPLACE PROCEDURE MY_NEW_JOB_PROC
(
    P_JOB_ID    IN  JOBS.JOB_ID%TYPE,
    P_JOB_TITLE    IN  JOBS.JOB_TITLE%TYPE,
    P_MIN_SALARY    IN  JOBS.MIN_SALARY%TYPE := 10, -- 디폴트 설정
    P_MAX_SALARY    IN  JOBS.MAX_SALARY%TYPE := 100, -- 디폴트 설정
)
...
  • 한 가지 주의할 점은 디폴트 값은 IN 매개변수에만 사용할 수 있다.
  • OUT, IN OUT 매개변수에는 디폴트 값을 설정할 수 없다.

OUT 매개변수
  • OUT 매개변수란 프로시저 실행 시점에 OUT 매개변수를 변수 형태로 전달하고,

    프로시저 실행부에서 이 매개변수에 특정 값을 할당한다.

    그리고 나서 실행이 끝나면 전달한 변수를 참조해 값을 가져올 수 있는 것이다.

    프로시저 생성 시 매개변수명과 데이터 타입만 명시하면 디폴트로 IN 매개변수가 되지만

    OUT 매개변수는 반드시 OUT 키워드를 명시해야 한다.

-- JOBS 테이블 데이터 입력/수정시 작업한 날짜정보를 OUT출력 매개변수를 사용하여,
-- 외부로 내보내는 기능
CREATE OR REPLACE PROCEDURE MY_NEW_JOB_PROC
(
    P_JOB_ID    IN  JOBS.JOB_ID%TYPE,
    P_JOB_TITLE    IN  JOBS.JOB_TITLE%TYPE,
    P_MIN_SALARY    IN  JOBS.MIN_SALARY%TYPE := 10, -- 기본값 설정
    P_MAX_SALARY    IN  JOBS.MAX_SALARY%TYPE := 100, -- 기본값 설정
    P_UPD_DATE  OUT JOBS.UPDATE_DATE%TYPE -- OUT은 값을 내보내는 변수
)
IS
    VN_CNT NUMBER := 0;
    VN_CUR_DATE JOBS.UPDATE_DATE%TYPE := SYSDATE;
BEGIN
    -- JOB_ID 값을 중복체크
    SELECT COUNT(*)
    INTO VN_CNT
    FROM JOBS
    WHERE JOB_ID = P_JOB_ID;
    
    IF VN_CNT = 0 THEN
    -- 실행문장
        INSERT INTO JOBS(JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY, CREATE_DATE, UPDATE_DATE)
        VALUES (P_JOB_ID, P_JOB_TITLE, P_MIN_SALARY, P_MAX_SALARY, VN_CUR_DATE, VN_CUR_DATE);
    ELSE
        UPDATE JOBS
            SET JOB_TITLE = P_JOB_TITLE,
                MIN_SALARY = P_MIN_SALARY,
                MAX_SALARY = P_MAX_SALARY,
                UPDATE_DATE = VN_CUR_DATE
            WHERE JOB_ID = P_JOB_ID;
    END IF;
    
    -- OUT 매개변수에 현재날짜 값을 할당
    P_UPD_DATE := VN_CUR_DATE;
    
    COMMIT;
END;




-- OUT 매개변수의 프로시저 테스트. 익명블록 구문을 이용
DECLARE
    -- 프로시저의 OUT 매개변수의 값을 받고자 하는 
    VD_CUR_DATE JOBS.UPDATE_DATE%TYPE;
BEGIN
    -- 익명블록 프로시저를 실행시 EXECUTE 키워드를 생략해야 한다
    -- EXECUTE MY_NEW_JOB_PROC('SM_JOB1', 'SAMPLE JOB1', 1000, 2000, VD_CUR_DATE); 에러
    MY_NEW_JOB_PROC('SM_JOB1', 'SAMPLE JOB1', 1000, 2000, VD_CUR_DATE);
    
    DBMS_OUTPUT.PUT_LINE(VD_CUR_DATE);
END;

IN OUT 매개변수
  • 또 다른 유형으로 IN OUT 매개변수가 있는데,

    이렇게 선언하면 입력과 동시에 출력용으로 사용할 수 있다.

    여기서 한 가지 짚고 넘어갈 점이 있는데,

    프로시저 실행 시 OUT 매개변수에 전달할 변수에 값을 할당해서 넘겨줄 수 있지만 큰 의미는 없는 일이다

-- 함수 또는 프로시저 생성시 매개변수의 타입 NUMBER(10), VARCHAR2(10) 길이는 실행하면 안된다
CREATE OR REPLACE PROCEDURE MY_PARAMETER_TEST_PROC
(
    P_VAR1 IN VARCHAR2, -- IN 생략 가능(기본값)
    P_VAR2 OUT VARCHAR2,
    P_VAR3 IN OUT VARCHAR2
)
IS

BEGIN
    -- 패키지, 프로시저()
    DBMS_OUTPUT.PUT_LINE('P_VAR1 VALUE = ' || P_VAR1); -- 입력받은 값이 출력
    DBMS_OUTPUT.PUT_LINE('P_VAR2 VALUE = ' || P_VAR2); -- 공백 출력
    DBMS_OUTPUT.PUT_LINE('P_VAR3 VALUE = ' || P_VAR3); -- 입력받은 값이 출력
    
    P_VAR2 := 'B2';
    P_VAR3 := 'C2'; -- 입력받은 값이 C2 할당
END;



-- 프로시저 테스트. 익명블록
DECLARE
    V_VAR1  VARCHAR2(10) := 'A';
    V_VAR2  VARCHAR2(10) := 'B';
    V_VAR3  VARCHAR2(10) := 'C';
BEGIN
    -- EXXC 제외
    MY_PARAMETER_TEST_PROC(V_VAR1, V_VAR2, V_VAR3);
    
    DBMS_OUTPUT.PUT_LINE('V_VAR2 VALUE = ' || V_VAR2); -- P_VAR2 변수의 값을 출력
    DBMS_OUTPUT.PUT_LINE('V_VAR3 VALUE = ' || V_VAR3); -- P_VAR3 변수의 값을 출력
END;

태그:

카테고리:

업데이트:

댓글남기기