우선 예제에서 사용할 프로시저는 다음과 같습니다. 첫 번째 프로시저는 IN, OUT, IN OUT 매개변수를 매개로 하며, 두 번째 프로시저는 IN 매개변수 하나를 사용합니다.
CREATE OR REPLACE PACKAGE USER_NAME.PACKAGE_NAME IS
PROCEDURE PROCEDURE_NAME(IN_PARAM_NAME IN VARCHAR2,
OUT_PARAM_NAME OUT VARCHAR2,
IN_OUT_PARAM_NAME IN OUT VARCHAR2);
PROCEDURE PROCEDURE_NAME(IN_PARAM_NAME IN VARCHAR2);
END;
/
CREATE OR REPLACE PACKAGE BODY USER_NAME.PACKAGE_NAME
IS
PROCEDURE PROCEDURE_NAME (IN_PARAM_NAME IN VARCHAR2,
OUT_PARAM_NAME OUT VARCHAR2,
IN_OUT_PARAM_NAME IN OUT VARCHAR2)
IS
BEGIN
DBMS_OUTPUT.PUT_LINE ('PROCEDURE => BEFORE SET');
DBMS_OUTPUT.PUT_LINE ('IN: ' || IN_PARAM_NAME);
DBMS_OUTPUT.PUT_LINE ('OUT: ' || OUT_PARAM_NAME);
DBMS_OUTPUT.PUT_LINE ('IN OUT: ' || IN_OUT_PARAM_NAME);
OUT_PARAM_NAME := 'OUT_2';
IN_OUT_PARAM_NAME := 'IN_OUT_2';
DBMS_OUTPUT.PUT_LINE ('PROCEDURE => AFTER SET ''out'', ''in out''');
DBMS_OUTPUT.PUT_LINE ('IN: ' || IN_PARAM_NAME);
DBMS_OUTPUT.PUT_LINE ('OUT: ' || OUT_PARAM_NAME);
DBMS_OUTPUT.PUT_LINE ('IN OUT: ' || IN_OUT_PARAM_NAME);
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.PUT_LINE (SQLERRM);
END;
PROCEDURE PROCEDURE_NAME (IN_PARAM_NAME IN VARCHAR2)
IS
BEGIN
DBMS_OUTPUT.PUT_LINE ('PROCEDURE => in parameter');
DBMS_OUTPUT.PUT_LINE ('IN: ' || IN_PARAM_NAME);
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.PUT_LINE (SQLERRM);
END;
END;
/
오라클 프로시저 실행 방법. BEGIN END, OUT 변수 출력하기
PL/SQL 블록(begin, end)을 통해 호출하는 방법입니다. Out 변수를 출력하는 방법, 그리고 각 파라미터 모드가 어떻게 값이 할당되는지 담아보았습니다. 변수 출력을 위한 DECLARE 선언부를 참고해 주세요.
DECLARE
IN_PARAM_NAME VARCHAR2 (32767);
OUT_PARAM_NAME VARCHAR2 (32767);
IN_OUT_PARAM_NAME VARCHAR2 (32767);
BEGIN
IN_PARAM_NAME := 'IN_1';
OUT_PARAM_NAME := 'OUT_1';
IN_OUT_PARAM_NAME := 'IN_OUT_1';
DBMS_OUTPUT.PUT_LINE ('CALLER => BEFORE CALL');
DBMS_OUTPUT.PUT_LINE ('IN: ' || IN_PARAM_NAME);
DBMS_OUTPUT.PUT_LINE ('OUT: ' || OUT_PARAM_NAME);
DBMS_OUTPUT.PUT_LINE ('IN OUT: ' || IN_OUT_PARAM_NAME);
PACKAGE_NAME.PROCEDURE_NAME (IN_PARAM_NAME,
OUT_PARAM_NAME,
IN_OUT_PARAM_NAME);
DBMS_OUTPUT.PUT_LINE ('CALLER => AFTER CALL');
DBMS_OUTPUT.PUT_LINE ('IN: ' || IN_PARAM_NAME);
DBMS_OUTPUT.PUT_LINE ('OUT: ' || OUT_PARAM_NAME);
DBMS_OUTPUT.PUT_LINE ('IN OUT: ' || IN_OUT_PARAM_NAME);
END;
/
CALLER => BEFORE CALL
IN: IN_1
OUT: OUT_1
IN OUT: IN_OUT_1
PROCEDURE => BEFORE SET
IN: IN_1
OUT:
IN OUT: IN_OUT_1
PROCEDURE => AFTER SET 'out', 'in out'
IN: IN_1
OUT: OUT_2
IN OUT: IN_OUT_2
CALLER => AFTER CALL
IN: IN_1
OUT: OUT_2
IN OUT: IN_OUT_2
PL/SQL procedure successfully completed.
위의 예제에서 별도의 매개변수를 할당하는 방법은 다음과 같이 람다식을 작성합니다.
PACKAGE_NAME.PROCEDURE_NAME (IN_PARAM_NAME => :IN_PARAM,
OUT_PARAM_NAME => :OUT_PARAM,
IN_OUT_PARAM_NAME => :IN_OUT_PARAM);
실제 변수와 형식 변수를 명시적으로 할당하는 방법입니다. (이번 예제는 실제 변수와 형식 변수가 이름이 동일하여 다음과 같이 작성을 할 수 있습니다)
PACKAGE_NAME.PROCEDURE_NAME (IN_PARAM_NAME => IN_PARAM_NAME,
OUT_PARAM_NAME => OUT_PARAM_NAME,
IN_OUT_PARAM_NAME => IN_OUT_PARAM_NAME);
EXEC
매개변수가 IN 모드만 있는 경우에는 서브프로그램 호출 구문을 생략하여, EXEC 명령을 통해 실행할 수도 있습니다.
EXEC PACKAGE_NAME.PROCEDURE_NAME ('BEOMSANG');
PROCEDURE => in parameter
IN: BEOMSANG
PL/SQL procedure successfully completed.