더북(TheBook)

OUT, IN OUT 매개변수

프로시저와 함수의 가장 큰 차이점은 반환 값의 존재 여부다. 그런데 프로시저에서도 값을 반환하는 방법이 있는데 바로 OUT 매개변수를 통해서 실현할 수 있다. OUT 매개변수란 프로시저 실행 시점에 OUT 매개변수를 변수 형태로 전달하고, 프로시저 실행부에서 이 매개변수에 특정 값을 할당한다. 그리고 나서 실행이 끝나면 전달한 변수를 참조해 값을 가져올 수 있는 것이다. 프로시저 생성 시 매개변수명과 데이터 타입만 명시하면 디폴트로 IN 매개변수가 되지만 OUT 매개변수는 반드시 OUT 키워드를 명시해야 한다. , my_new_job_proc에서 갱신일자를 받는 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_sal   IN JOBS.MIN_SALARY%TYPE := 10,
      p_max_sal   IN JOBS.MAX_SALARY%TYPE := 100 )
      p_upd_date  OUT JOBS.UPDATE_DATE%TYPE )
    IS
      vn_cnt NUMBER := 0;
      vn_cur_datec JOBS.UPDATE_DATE%TYPE := SYSDATE;
    BEGIN

      -- 동일한 job_id가 있는지 체크
      SELECT COUNT(*)
        INTO vn_cnt
        FROM JOBS
       WHERE job_id = p_job_id;

      -- 없으면 INSERT
      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_sal, p_max_sal, vn_cur_date, vn_cur_date);

      ELSE -- 있으면 UPDATE
        UPDATE JOBS
          SET job_title  = p_job_title,
             min_salary  = p_min_sal,
             max_salary  = p_max_sal,
             update_date = vn_cur_date
        WHERE job_id = p_job_id;
      END IF;

     -- OUT 매개변수에 일자 할당
     p_upd_date : = vn_cur_date;

      COMMIT;
    END ;

결과

    PROCEDURE MY_NEW_JOB_PROC이(가) 컴파일되었습니다.

기존에는 jobs 테이블의 create_date, update_date 컬럼 값으로 SYSDATE를 직접 입력했지만 이번에는 vn_cur_date 변수를 선언해 SYSDATE로 초기화한 뒤, 이 변수를 사용했다. 이렇게 처리한 이유는 SYSDATE는 초 단위로 값이 바뀌므로 jobs 테이블에 입력되거나 갱신된 일자 값을 정확히 가져오기 위해서다. 이제 프로시저를 실행하고 OUT 매개변수 값을 참조해야 하는데, 이때 별도의 변수를 선언해서 매개변수로 전달한 뒤 값을 참조해야 한다. 변수가 필요하므로 이 프로시저를 실행하는 익명 블록을 만들어 보자.

입력

    DECLARE
       vd_cur_date JOBS.UPDATE_DATE%TYPE;
    BEGIN
      EXECmy_new_job_proc ('SM_JOB1', 'Sample JOB1', 2000, 6000, vd_cur_date);

      DBMS_OUTPUT.PUT_LINE(vd_cur_date);
    END;

결과

    ORA-06550: 줄 4, 열8:PLS-00103: 심볼 "MY_NEW_JOB_PROC"를 만났습니다 다음 중 하나가 기대될 때:...

오류가 발생했다. 무엇이 잘못된 것일까? 익명 블록에서 프로시저를 실행하면 EXEC나 EXECUTE를 붙이지 않는다. 다른 함수나 프로시저, 패키지에서 실행할 경우도 마찬가지다.

입력

    DECLARE
      vd_cur_date JOBS.UPDATE_DATE%TYPE;
    BEGIN
      my_new_job_proc ('SM_JOB1', 'Sample JOB1', 2000, 6000, vd_cur_date);

      DBMS_OUTPUT.PUT_LINE(vd_cur_date);
    END;

결과

    2015/03/13 11:36:18

성공적으로 프로시저가 실행됐고 OUT 매개변수로 전달한 vd_cur_date 변수에 값이 할당됐음을 알 수 있다.

또 다른 유형으로 IN

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.